单位化整数值始终相同 (C++)
Unitialized int value always the same (C++)
给定此代码:
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)并且很快就会被注意到。
- 如何反转整数参数包
- enum是C++中的宏变量还是整数变量
- 努力将整数转换为链表。不知道我在这里做错了什么
- 整数不会重复超过随机数
- 在C++中手动调整数组大小
- 检查输入是否不是整数或数字
- C++使用整数的压缩数组初始化对象
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何只允许用户输入正整数
- 如何在c++中从文本文件中逐行读取整数
- C++:如何循环通过向量中的整数元素
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 序列化,没有库的整数,得到奇怪的结果
- 在一定长度后从数组中打印时缺少整数
- std::当在256字节边界上写入整数时,流的奇怪行为
- 内联程序集printf将整数解释为地址
- 是否基于数组B整数打印数组A中的整数
- 如何在C++中将整数转换为其数字数组