静态变量(文件范围和函数静态)初始化为零:
int x; // zero
int y = 0; // also zero
void foo() {
static int x; // also zero
}
非静态变量(局部变量)为indeterminate.在赋值之前读取它们,结果为undefined behavior.
void foo() {
int x;
printf("%d", x); // the compiler is free to crash here
}
在实践中,它们一开始往往只是有一些无意义的值——一些编译器甚至可能会输入特定的固定值,以便在调试器中查看时变得明显——但严格来说,编译器可以自由地执行任何操作,从崩溃到调用demons through your nasal passages.
至于为什么它是未定义的行为而不是简单的"未定义/任意值",有许多CPU体系 struct 在其表示中为各种类型添加了额外的标志位.一个现代的例子是the Itanium, which has a "Not a Thing" bit in its registers;当然,C标准的起草者正在考虑一些较旧的体系 struct .
try 使用设置了这些标志位的值可能会导致CPU在操作中出现异常,really不应该失败(例如,整数加法或分配给另一个变量).如果你不初始化一个变量,编译器可能会在设置了这些标志位的情况下拾取一些随机垃圾,这意味着触碰这个未初始化的变量可能是致命的.