非静态变量初始化

我正在读一本关于C progaming faq的书。 这是本书的篇章

自动变量是在没有static关键字的函数或代码块内定义的变量。 如果未显式初始化这些变量,则这些变量具有未定义的值。 如果未初始化自动变量,则必须确保在使用该值之前为其分配。

这是我的代码:

#include  int main (int argc, const char * argv[]) { { int x; printf("%d", x); } } 

printf的结果为0.为什么变量初始化?

对于静态和全局变量,它为0; 默认情况下不会初始化自动变量。

在c语言中,非静态局部变量没有默认值。 变量在成为变量之前保存内存中的内容。 最好在使用c语言之前始终初始化非静态局部变量(或者至少在将其与其他内容进行比较之前)。 此外,最好假设没有默认值,因为这会因语言和硬件而异。

阅读更多: http : //wiki.answers.com/Q/What_is_the_default_value_of_integer_in_c#ixzz1iaij7hRK

它没有初始化。 x占用的内存单元仍具有早期使用的值。 但是, x的值可能是任何值,因此您不能依赖它。

如果未显式初始化,则automatic变量的初始值是不确定的。

Indeterminate意味着未指定(可能是0或42)或陷阱表示。 陷阱意味着读取未初始化的变量未定义行为(例如,使程序崩溃)。

未定义意味着它可以是任何东西,甚至是0.另一个实现可能具有不同的或随机的值。 没有办法知道,你也不能相信它在每次执行时都是一样的。

有些编译器会为你做默认初始化,有些则不会。 你不应该指望他们。 这句话说

 int x; 

应该说

 int x = 0; 

如果那是你想要的。 对于某些C编译器,调用printf时x可能是-23157263。

因为在放置x的存储空间中已经有0,但这只是“运气”,那个地方可能有任何数字或符号。 因此,为了确保始终获得相同的结果,您应该始终初始化变量。

我记得在使用调试标志编译代码时,Visual Studio会(并且可能仍然)将自动变量设置为0或null。 像其他人所说,你当然不应该指望任何默认值。