C ++:未初始化的变量垃圾

时间:2010-04-17 18:46:33

标签: c++ memory memory-management ram

int myInt;
cout << myInt; // Garbage like 429948, etc

如果我在C ++中输出和/或使用未初始化的变量,它们的假设值是什么?

  • “最后一位用户”在内存中的实际值?

例如:程序A已关闭,它在1234处有一个值0x1234的int - &gt;我运行我的程序,myInt获取地址0x1234,我将其输出如上 - &gt; 1234

  • 这只是随机垃圾吗?

5 个答案:

答案 0 :(得分:11)

“随机垃圾”,但强调“垃圾”,“随机” - 即绝对任意垃圾甚至没有任何“随机性”保证 - 编译器和运行时系统被允许绝对有任何东西(有些系统可能总是给零,其他可能给出任意不同的值,等等。)

答案 1 :(得分:5)

它甚至不能保证是一个价值。尝试读取int,可能发生任何事情(例如发送的信号导致程序终止)。在现实生活中,特别重要的是,启用未初始化的bool可能会导致您遇到truefalse个案件。

答案 2 :(得分:4)

它的价值是不确定的。 (第8.5节/ 9)

尝试从中获取有意义的数据是没有用的。在实践中,它恰好发生在那里。

大多数编译器会在调试版本中打包“有意义”的调试数据。例如,MSVC会将事物初始化为0xCCCCCCCC。当然,这在优化的构建中被删除。

答案 3 :(得分:2)

整数是堆栈上的变量,因为它是局部变量。只要它尚未初始化,堆栈上的数据就是原样。它是以前使用过的数据(的一部分)。所以它是垃圾,但它不是随机的,因为给定可执行文件和开始状态,该值是可预测的。预测很难,因为你必须考虑操作系统,编译器等帐户,而且这是非常没有意义的。

答案 4 :(得分:2)

  

程序A已关闭,它有一个int值为1234,位于0x1234 - &gt;我运行我的程序,myInt得到地址0x1234 ......

另请注意,由于现代操作系统中的虚拟内存,所谓的地址0x1234的程序A不太可能实际引用物理内存中与程序调用地址0x1234相同的空间。