如我们所知,使用未初始化的变量在C或C++中是未定义的行为。例如,如果我们有:C编译器如何使用未初始化的变量进行处理?
int x;
printf("%d", x);
它会产生一个我们无法预测的数字。
我的问题是,C编译器如何处理使用未初始化的变量。
如我们所知,使用未初始化的变量在C或C++中是未定义的行为。例如,如果我们有:C编译器如何使用未初始化的变量进行处理?
int x;
printf("%d", x);
它会产生一个我们无法预测的数字。
我的问题是,C编译器如何处理使用未初始化的变量。
这与编译器无关,尽管不同的编译器可能有副作用,影响值的方式看起来是一致的。但无论如何,你的程序有未定义的行为。您没有初始化该值,因此您的程序行为无法预测。
当您声明变量x
时,编译器仅记录您存储足够大的值以保存int
的意图。现在,它决定放在哪里并不重要。它可能会将它推到内存中的栈中,或者它可能会选择保持CPU寄存器可用而不使用内存。
所以,当你询问x
的价值时,绝对没有办法知道你会得到什么。很可能你会得到以前存在的任何肮脏的价值,在编译器确定它将放置的任何位置。但同样,编译器甚至可能完全无法决定在哪里生存,因为它从来没有被使用,然后做一些可怕的事情导致程序崩溃,或者其他任何事情。
的好消息是,你不必去计较什么可以什么样的条件下发生或为什么或。作为程序员,你需要关心的是行为是未定义的。故事结局。
如何解决这个问题?简单。在尝试读取其值之前,请给x
一个值。
结果似乎并不奇怪!
但它是常见的,如果尝试打印这是不早initialized.It通常被称为是一个垃圾值。一般C或C的变量的值++编译器采用垃圾值可以是任何(正或消极)主要是非零(在你的问题你得到一个2)
摆脱垃圾的基本方法是初始化您的变量。只是使用声明的变量,而不初始化它们,产生纯粹的垃圾。永远不要忘记没有声明是空的,他们必须有一个垃圾关联它:)
对于这种情况具体而言,它不一定是“垃圾值”。该变量具有局部范围,但没有采用其地址。这总是未定义的行为,并可能导致与奇怪的输出一样的崩溃。 – Lundin
如果你没有初始化它,编译器也不会初始化它,它需要它以前包含的任何值。这就是为什么你应该初始化变量。 – AntonH
打印未初始化的本地变量将调用未定义的行为。结果可以是任何东西! –
请参阅[什么是未定义的行为?](http://stackoverflow.com/a/4105123/1505939) –