Ale*_*lex 13 c global-variables
#include <stdio.h>
int a[100];
int main(){
printf("%d",a[5]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码总是打印'0'还是编译器特定的?我正在使用gcc编译器,我输出为'0'.
sim*_*onc 31
是的,所有成员a都保证初始化为0.
从C89标准的3.5.7节
如果没有显式初始化具有静态存储持续时间的对象,则会隐式初始化它,就好像每个具有算术类型的成员都被赋值为0,并且每个具有指针类型的成员都被赋予空指针常量.
"全局变量"在文件范围内定义,在任何函数之外.在文件范围定义的所有变量以及使用关键字声明的所有变量都static具有称为静态存储持续时间的变量.这意味着它们将被分配在内存的单独部分中,并在程序的整个生命周期中存在.
这也意味着它们可以保证在任何C编译器上初始化为零.
从目前的C标准C11 6.7.9/10:
"...如果没有显式初始化具有静态或线程存储持续时间的对象,则:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它有算术类型,则初始化为(正或无符号)零;"
实际上,这意味着如果你初始化的全局变量给定值,就会有一个价值,它会在通常被称为内存段分配.data.如果您没有给它一个值,它将被分配在另一个名为的段中.bss.Globals永远不会被分配到堆栈中.
是的。任何全局变量都会初始化为该类型的
默认值。0是默认值并自动转换为任何类型。如果它是一个指针,0则变为NULL
全局变量在数据段中获得被清零的空间。
它不是特定于编译器的,而是在 C 标准中定义的。
所以它总是打印0。