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

问题描述 投票:-7回答:2

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

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

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

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

c gcc compiler-construction
2个回答
4
投票

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

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

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

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

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


1
投票

结果似乎并不奇怪!!!!

但是,如果尝试打印一个之前未初始化的变量值,这种情况很常见。它通常被认为是一个垃圾值。通常,c或c ++编译器会获取垃圾值,它可以是任何(正面或负面),主要是非零值(在你的问题中,你得到2)

摆脱垃圾的基本方法是初始化你的变量。只是使用声明的变量而不初始化它们,只生成垃圾。永远记得没有宣称是空的,他们必须有一个与之相关的垃圾:)

© www.soinside.com 2019 - 2024. All rights reserved.