我正在阅读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
值?
答案 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()
分配的变量不是。