正如我们所知,使用未初始化的变量在C或C++中是未定义的行为。例如,如果我们有:
int x; printf("%d", x);
它会产生一个我们无法预测的数字。我的问题是C编译器如何处理使用未初始化的变量。
r6vfmomb1#
这与你的编译器无关,尽管不同的编译器可能会有副作用,这些副作用会以一种看起来一致的方式影响这个值。但是不管怎样,你的程序有“未定义的行为”。你没有初始化这个值,所以你的程序的行为是无法预测的。当你声明变量x时,编译器只记录你想要存储一个足够大的值来保存int,现在,它决定把这个值放在哪里并不重要,它可能会把它推到内存中的堆栈上,或者它可能会选择保持CPU寄存器可用而根本不使用内存。所以,当你请求x的值时,你绝对无法知道你会得到什么。很可能你会得到任何脏值,不管它以前存在于编译器决定要保留的任何位置。但是同样,编译器甚至可能完全无法决定x的位置,因为它从来没有被使用过,然后做一些可怕的事情,导致程序崩溃。或者其他任何东西。好消息是,你不必关心什么 * 可能 * 发生或 * 为什么 * 或 * 在什么条件下 *。作为一个程序员,你需要关心的是行为是未定义的。故事结束。如何解决这个问题呢?很简单。在试图读取x的值之前,先给它一个值。
x
int
lb3vh1jj2#
结果似乎一点也不奇怪!!!!但是如果试图打印一个没有被初始化的变量的值,这是很常见的。它通常被认为是一个垃圾值。一般来说,c或c++编译器接受垃圾值,它可以是任何(正的或负的)主要非零值。(在你的问题中你得到一个2)清除垃圾的基本方法是初始化你的变量。仅仅使用声明的变量而不初始化它们,只会产生垃圾。永远记住没有声明的是空的,它们必须有一个垃圾与之相关联:)
2条答案
按热度按时间r6vfmomb1#
这与你的编译器无关,尽管不同的编译器可能会有副作用,这些副作用会以一种看起来一致的方式影响这个值。但是不管怎样,你的程序有“未定义的行为”。你没有初始化这个值,所以你的程序的行为是无法预测的。
当你声明变量
x
时,编译器只记录你想要存储一个足够大的值来保存int
,现在,它决定把这个值放在哪里并不重要,它可能会把它推到内存中的堆栈上,或者它可能会选择保持CPU寄存器可用而根本不使用内存。所以,当你请求
x
的值时,你绝对无法知道你会得到什么。很可能你会得到任何脏值,不管它以前存在于编译器决定要保留的任何位置。但是同样,编译器甚至可能完全无法决定x
的位置,因为它从来没有被使用过,然后做一些可怕的事情,导致程序崩溃。或者其他任何东西。好消息是,你不必关心什么 * 可能 * 发生或 * 为什么 * 或 * 在什么条件下 *。作为一个程序员,你需要关心的是行为是未定义的。故事结束。
如何解决这个问题呢?很简单。在试图读取
x
的值之前,先给它一个值。lb3vh1jj2#
结果似乎一点也不奇怪!!!!
但是如果试图打印一个没有被初始化的变量的值,这是很常见的。它通常被认为是一个垃圾值。一般来说,c或c++编译器接受垃圾值,它可以是任何(正的或负的)主要非零值。(在你的问题中你得到一个2)
清除垃圾的基本方法是初始化你的变量。仅仅使用声明的变量而不初始化它们,只会产生垃圾。永远记住没有声明的是空的,它们必须有一个垃圾与之相关联:)