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

Posted

技术标签:

【中文标题】未初始化的 int 值始终相同 (C++)【英文标题】:Unitialized int value always the same (C++) 【发布时间】:2011-04-06 15:34:05 【问题描述】:

鉴于此代码:

void main()

int x; 
cout << x;
system("pause");

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

【问题讨论】:

这几乎肯定是在调用 main 之前执行的 C 运行时代码留在堆栈空间中的值。 x 在栈上的位置保持不变,并且每次运行时执行的步骤都是一样的,所以栈上留下的值是一样的。 用“indeterminate”代替“random”可能会消除混乱。该值不是严格随机意义上的“随机”,但您无法控制它的值。 另外,C++ 标准不允许void main()。请改用int main()。它保证按标准工作,并且可以少输入一个字符。 (您从哪里读到未初始化的 int 应该有一个随机值?标准使用“不确定”这个词。) 是的,对不起,我的错,它是不确定的。我只是随机关联,不知道为什么。 【参考方案1】:

您的困惑在于“在发布模式下,这应该得到一个随机值”。这不是真的。

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

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

【讨论】:

【参考方案2】:

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

如果不是这样,则可能是您的流程内部的其他一些初始化任务的东西。它不是来自其他进程的东西,也不是“碰巧”在物理内存中的那个位置,因为 Windows(您的应用程序在其上运行)永远不会在不先将它们清空的情况下提供属于其他进程的内存页面。

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


我忘记了...void main 不是有效的 C++,它应该是 int main(§3.6.1 ¶2,“它的返回类型应该是 int)。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于未初始化的 int 值始终相同 (C++)的主要内容,如果未能解决你的问题,请参考以下文章

为啥 int 数组在 C++ 中未初始化为零?

C++ Primer 知识总结

Clang 没有报告 C++ 中未初始化的变量?

C++ - 在地图中搜索所有具有相同值的键的最快方法是啥?

标准库类型vector[C++ primer]

delete与delete[]