2017-05-08 75 views
-7

如我们所知,使用未初始化的变量在C或C++中是未定义的行为。例如,如果我们有:C编译器如何使用未初始化的变量进行处理?

int x; 
printf("%d", x); 

它会产生一个我们无法预测的数字。

我的问题是,C编译器如何处理使用未初始化的变量。

+1

如果你没有初始化它,编译器也不会初始化它,它需要它以前包含的任何值。这就是为什么你应该初始化变量。 – AntonH

+2

打印未初始化的本地变量将调用未定义的行为。结果可以是任何东西! –

+1

请参阅[什么是未定义的行为?](http://stackoverflow.com/a/4105123/1505939) –

回答

4

这与编译器无关,尽管不同的编译器可能有副作用,影响值的方式看起来是一致的。但无论如何,你的程序有未定义的行为。您没有初始化该值,因此您的程序行为无法预测。

当您声明变量x时,编译器仅记录您存储足够大的值以保存int的意图。现在,它决定放在哪里并不重要。它可能会将它推到内存中的栈中,或者它可能会选择保持CPU寄存器可用而不使用内存。

所以,当你询问x的价值时,绝对没有办法知道你会得到什么。很可能你会得到以前存在的任何肮脏的价值,在编译器确定它将放置的任何位置。但同样,编译器甚至可能完全无法决定在哪里生存,因为它从来没有被使用,然后做一些可怕的事情导致程序崩溃,或者其他任何事情。

的好消息是,你不必去计较什么可以什么样的条件下发生或为什么。作为程序员,你需要关心的是行为是未定义的。故事结局。

如何解决这个问题?简单。在尝试读取其值之前,请给x一个值。

+0

但是为什么输出是2呢?作为对我的问题的评论说,编译器会采取以前包含的任何值。什么样的行为使得需要2? – dapao

+0

@dapao未定义的行为。 –

+1

@dapao编译器在某个内存位置声明'x'。由于您尚未初始化它,所以内存位置可能包含任何内容...其他代码执行中遗留的任何内容等等。当您读取内存位置时,您读取的是旧值。早期的程序必须写在那里2,因此你得到2. – Swanand

1

结果似乎并不奇怪!

但它是常见的,如果尝试打印这是不早initialized.It通常被称为是一个垃圾值。一般C或C的变量的值++编译器采用垃圾值可以是任何(正或消极)主要是非零(在你的问题你得到一个2)

摆脱垃圾的基本方法是初始化您的变量。只是使用声明的变量,而不初始化它们,产生纯粹的垃圾。永远不要忘记没有声明是空的,他们必须有一个垃圾关联它:)

+0

对于这种情况具体而言,它不一定是“垃圾值”。该变量具有局部范围,但没有采用其地址。这总是未定义的行为,并可能导致与奇怪的输出一样的崩溃。 – Lundin