24
#include <stdio.h>
int a[100];
int main(){
    printf("%d",a[5]);
    return 0;
}

上面的代码总是打印'0'还是编译器特定的?我正在使用 gcc 编译器,输出为“0”。

4

6 回答 6

45

是的,所有成员a都保证被初始化为 0。

来自 C89 标准的第 3.5.7 节

如果一个具有静态存储持续时间的对象没有显式初始化,它会被隐式初始化,就好像每个具有算术类型的成员都被分配了 0 并且每个具有指针类型的成员都被分配了一个空指针常量。

于 2013-04-15T12:57:25.540 回答
18

“全局变量”在文件范围内定义,在任何函数之外。在文件范围内定义的所有变量和使用关键字声明的所有变量都static具有称为静态存储持续时间的东西。这意味着它们将被分配在内存的单独部分中,并存在于程序的整个生命周期中。

这也意味着它们保证在任何 C 编译器上都被初始化为零。

从当前的 C 标准 C11 6.7.9/10 开始:

"...如果一个具有静态或线程存储持续时间的对象没有被显式初始化,那么:

— 如果它具有指针类型,则将其初始化为空指针;

— 如果它具有算术类型,则将其初始化为(正或无符号)零;"

实际上,这意味着如果将全局变量初始化为给定值,它将具有该值,并且将分配在通常称为.data. 如果你不给它一个值,它将被分配到另一个名为.bss. 全局变量永远不会在堆栈上分配。

于 2013-04-15T13:17:28.757 回答
4

是的。任何全局变量都被初始化为该类型的默认值0是默认值并自动转换为任何类型。如果是指针,0则变为NULL

全局变量在被清零的数据段中获得空间。

不是特定于编译器的,而是在 C 标准中定义的。

所以它总是打印 0。

于 2013-04-15T12:55:03.473 回答
3

0默认情况下,没有显式初始化器声明的文件范围对象会被初始化(NULL对于指针也是如此)。

在没有显式初始化程序的情况下声明的块范围内的非静态对象未初始化。

于 2013-04-15T12:55:46.887 回答
1

全局变量是否总是在 C 中初始化为零?

是的,它在 C 标准中定义。

于 2013-04-15T12:55:40.120 回答
0

它不是特定于编译器的。代码将始终打印0.

于 2013-04-15T12:55:14.337 回答