C编译器如何处理使用未初始化的变量?

时间:2017-05-08 04:14:31

标签: c gcc compiler-construction

正如我们所知,使用未初始化的变量是C或C ++中未定义的行为。例如,如果我们有:

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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