Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中全局变量总是初始化为零吗? #包括 INTA[100]; int main(){ printf(“%d”,a[5]); 返回0; }_C_Global Variables - Fatal编程技术网

在C中全局变量总是初始化为零吗? #包括 INTA[100]; int main(){ printf(“%d”,a[5]); 返回0; }

在C中全局变量总是初始化为零吗? #包括 INTA[100]; int main(){ printf(“%d”,a[5]); 返回0; },c,global-variables,C,Global Variables,上面的代码总是打印“0”还是特定于编译器?我使用的是gcc编译器,输出为“0”。是。 任何全局变量都会初始化为该类型的默认值。 0是默认值,自动转换为任何类型。 如果是指针,0变为NULL 全局变量在数据段中获得空间,该空间被调零 它不是特定于编译器的,而是在C标准中定义的 因此它将始终打印0。它不是特定于编译器的。代码将始终打印0 在C中,全局变量总是初始化为零吗 是的,它是在C标准中定义的。没有显式初始值设定项的文件范围对象在默认情况下由0初始化(对于指针,则初始化为NULL) 未使用显式初

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

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

全局变量在数据段中获得空间,该空间被调零


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


因此它将始终打印0。

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

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


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

没有显式初始值设定项的文件范围对象在默认情况下由
0
初始化(对于指针,则初始化为
NULL


未使用显式初始值设定项声明的块作用域中的非静态对象保持未初始化状态。

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

来自C89标准第3.5.7节

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

“全局变量”在任何函数之外的文件范围内定义。在文件范围内定义的所有变量以及用关键字
static
声明的所有变量都有一个称为static storage duration的东西。这意味着它们将被分配到内存的一个单独部分,并在程序的整个生命周期中存在

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

根据当前的C标准C116.7.9/10:

“…如果没有初始化具有静态或线程存储持续时间的对象 明确地说,那么:

-如果有指针类型,则初始化为空指针

-如果它有算术类型,则初始化为(正或无符号)零


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

XORing本身是一个实现细节;如何将内容归零并不重要。此外,我非常怀疑任何现代实现是否会使用XOR来清空内存,因为它会导致额外的读取操作,这完全是不必要的,并且会增加应用程序的启动时间。XOR本身可以很好地清除某些处理器上的寄存器,这些处理器没有“将寄存器设置为零”的特殊指令。将内存区域设置为零是不好的。我相信这是来自“X3”ANSI C草稿?同样的文本仍然存在于C标准中,但为什么要引用这样一个陈旧过时的来源呢?@Lundin这是我唯一必须掌握的来源,我认为它仍然比“是的,(未引用的)标准这么说”更好。我想让你参考一个更现代的标准。啊哈,这个标准在网上很容易找到。草案和最终C11标准之间的差异是表面的,除了a。1989 C标准和当前标准之间的变化是,具有自动存储持续时间的未初始化对象没有不确定的值。通常,使用此类对象产生的行为不受标准的定义。最好的参考是可用的最旧的参考,因为它将显示规则存在的历史。如果您引用C18标准,我可能(错误地)认为这是标准的一个新部分。知道1975年编写的C代码将其全局未初始化变量设置为零是很重要的。我希望能参考建立这一规则的最古老的标准。
#include <stdio.h>
int a[100];
int main(){
    printf("%d",a[5]);
    return 0;
}