单位化整数值始终相同 (C++)

Unitialized int value always the same (C++)

本文关键字:C++ 整数 单位      更新时间:2023-10-16

给定此代码:

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

当我调试这段代码时,它总是打印 -858993460A。我读到这是因为 VS 将其设置为单位化变量的默认值。但我也读到,在发布模式下,这应该得到随机值。但是每次我在发布模式下运行此代码时,我都会得到 1772893972A ,它没有改变 ->它不是随机的。这是怎麽?为什么我得到这个值?

您的困惑在于假设"在发布模式下,这应该得到一个随机值"。事实并非如此。

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

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

main不是

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

如果不是这样,则可能是来自进程内部其他初始化任务的内容。它不是来自其他进程的东西,也不是"碰巧"在物理内存中的那个位置的东西,因为Windows(运行应用程序)永远不会提供属于其他进程的内存页,而无需先清空它们。

不过,请记住,就标准而言,未初始化的变量具有"不确定的初始值"(§3.3.1 ¶9),因此您不应该依赖通过读取未初始化变量可能获得的值。如果需要随机数,请使用相应的库函数。

<小时 />

我忘了... void main C++无效,则应int main(§3.6.1 ¶2,"它应具有int类型的返回类型")。

有趣的是,十六进制的 DEBUG 值是0xFFFFFFFFCCCCCCCC。十六进制的 RELEASE 值只是随机的。可能是调试编译添加了一个堆栈涂鸦器,以确保未初始化的值不理智(如 0)并且很快就会被注意到。