在c中,未初始化的整数是否总是默认为0?
我正在阅读nginx的源代码,发现它没有初始化许多数值变量,包括在c中,未初始化的整数是否总是默认为0?,c,default-value,initialization,C,Default Value,Initialization,我正在阅读nginx的源代码,发现它没有初始化许多数值变量,包括ngx_int_t ngx_last_进程,此处定义为长int #if 0 ngx_last_process = 0; #endif 所以这里@Igor Sysoev认为没有必要进行初始化 但在程序中,它假定默认值为0: for (s = 0; s < ngx_last_process; s++) { if (ngx_processes[s].pid == -1) {
ngx_int_t ngx_last_进程
,此处定义为长int
#if 0
ngx_last_process = 0;
#endif
所以这里@Igor Sysoev认为没有必要进行初始化
但在程序中,它假定默认值为0
:
for (s = 0; s < ngx_last_process; s++) {
if (ngx_processes[s].pid == -1) {
break;
}
}
for(s=0;s
是否保证未初始化的变量在c中有0
值?文件范围中声明的变量(如int
)被初始化为0
范例
int i;
int main()
{
int x;
printf("%d",i); // prints 0
printf("%d",x); // prints some unspecified value
}
是否保证未初始化的变量在c中的值为0
不!对于在函数作用域中声明的变量,这是不成立的。默认情况下,外部变量和静态变量初始化为零,这是有保证的。没有显式初始值设定项的自动变量和寄存器变量将具有不确定值(未指定值或陷阱表示)
根据标准:
C89
6.5.7:
如果没有初始化具有静态存储持续时间的对象
显式地,它被隐式初始化,就像每个
算术类型被分配为0,并且每个成员都具有指针类型
分配了一个空指针常量。如果一个物体
未显式初始化自动存储持续时间,其值为
不确定
C99
6.2.4,§5:
对于这种没有可变长度数组类型的对象,其生存期将延长
从进入与其关联的块,直到该块的执行在
无论如何。(输入封闭块或调用函数将挂起,但不会结束,
当前块的执行。)如果以递归方式输入块,则
每次都会创建一个对象。对象的初始值是不确定的。如果
初始化是为对象指定的,每次执行声明时都会执行初始化
在执行区块时达到;否则,该值将变得不确定
到达声明的时间
6.7.8,§10:
如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。如果没有显式初始化具有静态存储持续时间的对象,则:
-如果有指针类型,则初始化为空指针
-如果它有算术类型,则初始化为(正或无符号)零
-如果是聚合,则根据这些规则(递归地)初始化每个成员
-如果是联合,则根据这些规则(递归地)初始化第一个命名成员
3.17.2,§1:
不确定值:未指定的值或陷阱表示
3.17.3,§1:
未指定值:在任何情况下,如果本国际标准未对选择的值施加任何要求,则相关类型的有效值。注意:未指定的值不能是陷阱表示。它取决于变量的分配方式。静态分配的变量初始化为零,而在堆栈上或使用
malloc()
分配的变量则不为零。自动(本地)变量不保证为零,可能包含垃圾
global
变量和static
变量保证为零。printf(“%d”,x)代码>语句还可以使NUM LOCK灯闪烁(特别是当您的体系结构允许在int
s中使用陷阱表示时)@pmg:Yes!毕竟,行为还没有定义。有点错误。您可以声明intx代码>在文件范围内,并且仍然具有定义intx=1代码>其他地方。:)我确信C就是这样工作的,但我经历了一些不同的事情。在一个小程序中,x为零。由于x在随后的执行中为零,我不认为它是偶然的零。可能是新的编译器导致了不同的行为吗?”(一些垃圾值“…或陷阱表示或任何东西…”“@pmg,什么是陷阱表示”
?“未定义值”应该是“不确定值”,以使用C99标准的措辞。陷阱表示是内存中的一种位模式,如果您使用类型不是char
@cpuer的l值访问它,则会导致未定义的行为。陷阱表示是不表示有效值的位的排列。当前大多数计算机对不同的有效值使用全位表示,特别是在整数类型中,但该语言并不强制要求这样做。陷阱表示不是垃圾值。