#include <stdio.h>
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:
"……如果没有初始化具有静态或线程存储持续时间的对象明确,那么:
—如果是指针类型,则初始化为空指针;
-如果是算术类型,则初始化为(正数或无符号)0;"
实际上,这意味着如果你将全局变量初始化为给定的值,它将具有该值,并且它将被分配到通常称为.data
的内存段中。如果不给它赋值,它将被分配到另一个称为.bss
的段中。全局变量永远不会在堆栈上分配。
是。任何全局变量都初始化为该类型的默认值。0
是默认值,可以自动转换为任何类型。如果是指针,则0
变为NULL
全局变量在数据段中的空间被归零。
不是特定于编译器的,而是在C标准中定义的。
所以它总是打印0
没有显式初始化的文件范围对象默认由0
初始化(指针为NULL
)。
在块范围内声明的没有显式初始化的非静态对象将不初始化。
在C中全局变量总是初始化为零吗?
与编译器无关。代码将始终打印0
。