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


#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

相关内容

  • 没有找到相关文章

最新更新