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

cpu*_*uer 22 c initialization default-value

我正在阅读nginx的源代码并发现它没有初始化许多数值变量,包括ngx_int_t ngx_last_process;,这里ngx_int_t定义为long int

#if 0
    ngx_last_process = 0;
#endif
Run Code Online (Sandbox Code Playgroud)

那么@Igor Sysoev认为没有必要进行初始化?

但是在程序中它假定默认值是0:

    for (s = 0; s < ngx_last_process; s++) {
        if (ngx_processes[s].pid == -1) {
            break;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

Wiz*_*Wiz 28

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

来自标准:

C89

6.5.7:

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

C99

6.2.4,§5:

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

6.7.8,§10:

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

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

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

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

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

3.17.2,§1:

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

3.17.3,§1:

未指定的值:相关类型的有效值,其中本国际标准不对任何情况下选择的值施加任何要求.注意未指定的值不能是陷阱表示.


Pra*_*rav 5

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

例子

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

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

不!这不适用于在函数作用域中声明的变量。


pho*_*xis 5

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

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