C 编译器如何处理使用未初始化的变量?
How does C compilers handle using an uninitialized variable?
众所周知,使用未初始化的变量是 C 或 C++ 中的未定义行为。例如,如果我们有:
int x;
printf("%d", x);
它会产生一个我们无法预测的数字。
我的问题是 C 编译器如何处理使用未初始化的变量。
这与您的编译器无关,尽管不同的编译器可能会产生副作用,这些副作用会以一种看似一致的方式影响值。但无论如何,您的程序都有 未定义的行为 。您没有初始化该值,因此无法预测您的程序行为。
当您声明变量 x
时,编译器只会记录您存储一个足以容纳 int
的值的意图。现在,它决定把它放在哪里并不重要。它可能会将它推入内存中的堆栈,或者它可能会选择在根本不使用内存的情况下保持 CPU 寄存器可用。
所以,当你要求 x
的值时,绝对没有办法知道你会得到什么。您很可能会在编译器确定将其搁置的任何位置获得以前存在的任何脏值。但同样地,编译器甚至可能完全无法确定 x
所在的位置,因为它从未被使用过,然后做一些导致程序崩溃或其他任何事情的可怕事情。
好消息是您不必关心可能会发生什么或为什么或会发生什么什么条件。作为程序员,您需要关心的只是行为是否未定义。故事结束。
如何解决这个问题?简单。在尝试读取它的值之前给 x
一个值。
结果一点都不奇怪!!!
但是,如果尝试打印不是更早 initialized.It 的变量值,通常会被认为是 垃圾值 。通常是 c 或c ++编译器采用垃圾值,可以是任何(正或负)主要非零。(在你的问题中你得到一个 2 )
消除垃圾的基本方法是初始化您的 variables.Just 仅使用声明的变量而不初始化它们,只会生成垃圾。永远记住没有任何声明是空的,它们必须有与之关联的垃圾:)
众所周知,使用未初始化的变量是 C 或 C++ 中的未定义行为。例如,如果我们有:
int x;
printf("%d", x);
它会产生一个我们无法预测的数字。
我的问题是 C 编译器如何处理使用未初始化的变量。
这与您的编译器无关,尽管不同的编译器可能会产生副作用,这些副作用会以一种看似一致的方式影响值。但无论如何,您的程序都有 未定义的行为 。您没有初始化该值,因此无法预测您的程序行为。
当您声明变量 x
时,编译器只会记录您存储一个足以容纳 int
的值的意图。现在,它决定把它放在哪里并不重要。它可能会将它推入内存中的堆栈,或者它可能会选择在根本不使用内存的情况下保持 CPU 寄存器可用。
所以,当你要求 x
的值时,绝对没有办法知道你会得到什么。您很可能会在编译器确定将其搁置的任何位置获得以前存在的任何脏值。但同样地,编译器甚至可能完全无法确定 x
所在的位置,因为它从未被使用过,然后做一些导致程序崩溃或其他任何事情的可怕事情。
好消息是您不必关心可能会发生什么或为什么或会发生什么什么条件。作为程序员,您需要关心的只是行为是否未定义。故事结束。
如何解决这个问题?简单。在尝试读取它的值之前给 x
一个值。
结果一点都不奇怪!!!
但是,如果尝试打印不是更早 initialized.It 的变量值,通常会被认为是 垃圾值 。通常是 c 或c ++编译器采用垃圾值,可以是任何(正或负)主要非零。(在你的问题中你得到一个 2 )
消除垃圾的基本方法是初始化您的 variables.Just 仅使用声明的变量而不初始化它们,只会生成垃圾。永远记住没有任何声明是空的,它们必须有与之关联的垃圾:)