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