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

时间:2011-06-02 09:52:37

标签: c default-value initialization

我正在阅读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值?

4 个答案:

答案 0 :(得分:28)

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

来自标准:

<强> C89

6.5.7:

  

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

<强> C99

6.2.4,§5:

  

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

6.7.8,§10:

  

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

     
    

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

         

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

         

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

         

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

  

3.17.2,§1:

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

3.17.3,§1:

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

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

实施例

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

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

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

答案 3 :(得分:2)

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