在c中,未初始化的整数是否总是默认为0?

在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) {

我正在阅读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) {
            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值访问它,则会导致未定义的行为。
陷阱表示是不表示有效值的位的排列。当前大多数计算机对不同的有效值使用全位表示,特别是在整数类型中,但该语言并不强制要求这样做。陷阱表示不是垃圾值。