未初始化的int值始终相同(C ++)

时间:2011-04-06 15:34:05

标签: c++ default int initialization

鉴于此代码:

void main()
{
int x; 
cout << x;
system("pause");
}

当我调试这段代码时,它总是打印-858993460A。我读到它是因为VS将此设置为Unitialized vars的默认值。但我也读到,在发布模式下,这应该是随机值。但每次我在发布模式下运行此代码时,我都会 1772893972A ,这不会改变 - &gt;它不是随机的。这是什么?为什么我得到这个值?

3 个答案:

答案 0 :(得分:3)

你的困惑是假设“在发布模式下,这应该是一个随机值。”事实并非如此。

未初始化的变量获得“未定义”值。它可能是随机的,但不一定是。

如果您希望x具有随机值,请使用rand()。

答案 1 :(得分:1)

main不是可执行文件的真正入口点,一般来说,真正的入口点是由运行时库(在VC ++中就是这样),它执行一些CRT初始化任务,然后调用你的{ {1}}。该值可能是初始化代码执行的函数调用之一的剩余部分; Debug和Release版本之间的区别可能是由于两种配置之间的初始化/堆栈管理不同。顺便说一句,这样的值很可能总是相同的,可能它们来自某个参数/变量,每次都假设相同的值。

如果它不是那样的话,它可能来自你进程内部的一些其他初始化任务。它不是来自其他进程的东西,或者只是“碰巧”出现在物理内存中的那个位置,因为Windows(运行应用程序的程序)从未提供属于其他进程的内存页面,而不会先消隐它们。

但是,请记住,就标准而言,未初始化的变量具有“不确定初始值”(§3.3.1¶9),因此您不应该依赖于这些值你可以通过阅读未初始化的变量来获得。如果需要随机数,请使用适当的库函数。


我忘记了...... main无效C ++,它应该是void main(§3.6.1¶2,“它的返回类型应为{{1} }}“)。

答案 2 :(得分:0)

有趣的是,你的十六进制DEBUG值是0xFFFFFFFFCCCCCCCC。十六进制的RELEASE值只是随机的。可能是调试编译添加了一个堆栈scribbler,以确保您的未初始化值不合理(如0)并且很快就会显而易见。