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

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

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

例如:程序 A 已关闭,它有一个 int,其值为1234- 0x1234> 我运行我的程序,myInt获取地址0x1234,我像上面一样输出它 -> 1234

  • 它只是随机垃圾吗?
4

5 回答 5

11

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

于 2010-04-17T18:49:05.287 回答
5

它甚至不能保证是一个值。尝试读取 int,任何事情都可能发生(例如发送的信号导致您的程序终止)。在现实生活中的编程中具有特别重要的意义,打开未初始化bool可能会导致您既不碰true也不碰false情况。

于 2010-04-17T20:53:47.930 回答
4

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

试图从中获取有意义的数据是没有用的。在实践中,它只是发生在那里的任何事情。

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

于 2010-04-17T18:48:24.897 回答
2

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

于 2010-04-17T18:52:25.433 回答
2

程序 A 已关闭,它在 0x1234 处有一个值为 1234 的 int -> 我运行我的程序,myInt 获得地址 0x1234 ...

还要注意,由于现代操作系统中的虚拟内存,程序 A 称为地址 0x1234 的内容实际上不太可能与您的程序称为地址 0x1234 的物理内存中的空间相同。

于 2010-04-17T22:02:37.577 回答