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