原因不明的C++默认int值

kbi*_*irk 8 c c++ visual-studio

我一直在重构一些代码,我注意到一些涉及未初始化的int数组的不稳定行为:

int arr[ARRAY_SIZE];
Run Code Online (Sandbox Code Playgroud)

我设置了一个断点,似乎所有值都默认为-858993460.这个价值有什么特别之处吗?任何想法为什么他们不默认为0?

Cam*_*ron 17

C++中没有"默认" - 在你的代码初始化之前,变量和数组元素将包含最后的内存中的内容.

换句话说,当声明这些变量时,内存中的空间被保留供它们使用.从上次使用该内存时遗留的内存中的位仍然存在,导致您的变量最初看起来好像充满了"垃圾".内存并不总是立即归零的原因是速度 - 将内存清零需要时间.

您可以使用循环初始化数组,或使用此技巧(存在可读性较低的风险):

int mouseBufferX[mosueBufferSize] = { 0 };
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为当您使用值列表初始化数组时,并且文字值少于数组中元素的数量,其余元素始终初始化为0.


小智 15

-858993460是十六进制的CCCCCCCC,Visual Studio在DEBUG MODE中将其作为默认值.这是为了让您更容易注意到您忘记初始化变量.在发布模式下,它可以是任何东西.

我实际上不确定为什么mouseBufferX不是10个项目的元素(如果这确实编译而且不是10个元素).但我很确定该标准说静态非静态之前初始化静态.无论如何,我个人讨厌使用defines和consts来声明整数.请改用枚举.

C++不会将任何内容默认为0,因此您必须在使用之前为其指定值.静态变量是此规则的例外,因为它们默认设置为零.但我会注意到不鼓励使用静态变量,而某些语言(如C#)不允许在函数中声明静态变量.

  • @Dennis:枚举常量是rvalues,保证不消耗内存. (4认同)