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

我正在阅读nginx的源代码并发现它没有初始化许多数值变量,包括ngx_int_t ngx_last_process; ,这里ngx_int_t定义为long 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; } } 

是否保证未初始化的变量在c中将具有0值?

默认情况下, 外部静态变量初始化为零,这是有保证的。 没有显式初始值设定项的自动寄存器变量将具有不确定的值(未指定的值或陷阱表示)。

来自标准:

C89

6.5.7:

如果没有显式初始化具有静态存储持续时间的对象,则会隐式初始化它,就好像每个具有算术类型的成员都被赋值为0,并且每个具有指针类型的成员都被赋予空指针常量。 如果未显式初始化具有自动存储持续时间的对象,则其值不确定。

C99

6.2.4,§5:

对于没有可变长度数组类型的对象,它的生命周期从entry进入与之关联的块,直到该块的执行结束为​​止。(输入一个封闭的块或调用一个函数暂停,但不是结束,执行当前块。)如果以递归方式输入块,则每次都创建该对象的新实例。 对象的初始值是不确定的。 如果为对象指定了初始化,则每次在执行块时达到声明时都会执行初始化; 否则,每次达到声明时,该值将变为不确定。

6.7.8,§10:

如果未显式初始化具有自动存储持续时间的对象,则其值不确定。 如果未显式初始化具有静态存储持续时间的对象,则:

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

– 如果它有算术类型,则初始化为(正向或未对齐)零;

– 如果是聚合,则根据这些规则初始化(递归)每个成员;

– 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员。

3.17.2,§1:

不确定值:未指定的值或陷阱表示

3.17.3,§1:

未指定的值:相关类型的有效值,其中本国际标准未规定在任何情况下选择哪个值。 注意未指定的值不能是陷阱表示。

automatic (本地)变量不保证为零,可以包含垃圾。

global变量和static变量保证为零。

文件范围内声明(作为int )的变量初始化为0。

 int i; int main() { int x; printf("%d",i); // prints 0 printf("%d",x); // prints some unspecified value } 

是否保证未初始化的变量在c中将具有0值?

Nopes! 这不适用于在函数范围内声明的变量。

这取决于变量的分配方式。 静态分配的变量初始化为零,而在堆栈上或使用malloc()分配的变量则不是。