#include <stdio.h>
int a[100];
int main(){
printf("%d",a[5]);
return 0;
}
以上代码总是打印“ 0”,还是特定于编译器?我正在使用GCC编译器,然后将输出作为“ 0”。
a
的所有成员都可以初始化为0。
从C89Standard的第3.5.7节中
如果一个具有静态存储持续时间的对象未初始化 明确地,它被隐式初始化,好像每个具有的成员 算术类型分配了0,每个具有指针类型的成员 被分配了一个无效的指针常数。
文件范围,任何函数之外。在文件范围和使用关键字“全局变量”定义在
还意味着在任何C编译器上都保证将它们初始化为零。 当前C标准C11 6.7.9/10:
” ...如果未初始化具有静态或线程存储持续时间的对象 显式,然后: -如果它具有指针类型,则将其初始化为空指针;
-如果它具有算术类型,则将其初始化为(正或无符号)为零;
实际上,这意味着,如果您将全局变量初始化为给定值,则它将具有该值,并且将在通常称为
.data
的内存段中分配。如果您不给它一个值,它将分配在一个称为的部分中。全球永远不会在堆栈上分配。
.bss
是的。 任何全局变量均可初始化为该类型的
默认值
。
0
是默认值,并自动施放为任何类型。 如果是指针,
0
变成NULL
因此将始终打印0.
未经显式初始化器声明的文件范围对象是由0
默认情况下初始化的(对于指针)。
未经显式初始化器声明的块范围内的静态对象被非启用。
它不是编译器的特定于编译器。代码将始终打印NULL
。
在c?
中始终将Globle变量始终归功于零yyes,它在C标准中定义。