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

时间:2011-06-06 01:10:49

标签: c++ c visual-studio

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

int arr[ARRAY_SIZE];

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

6 个答案:

答案 0 :(得分:17)

C ++中没有“默认” - 在您的代码初始化之前,变量和数组元素将包含最后一个内存中的内容。

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

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

int mouseBufferX[mosueBufferSize] = { 0 };

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

答案 1 :(得分:14)

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

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

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

答案 2 :(得分:2)

您需要显式设置数组的值 - 它们不会“默认”为任何内容。 尝试:

memset(mouseBufferX,0,sizeof(mouseBufferX));

//or 

int mouseBufferX[mouseBufferSize] = {0};

//and, in C++ this *might* work too (fuzzy memory!):

int mouseBufferX[mouseBufferSize] = {};

答案 3 :(得分:2)

C ++不会初始化变量。当为变量分配一块内存时,该内存块保持原样并包含它在分配时所执行的值。

然而,一些编译器(比如g ++,我相信)自动将事物初始化为0 - 但不依赖于这种行为,因为它会降低你的代码的可移植性。

要使数组将其中的所有值初始化为值,您可以执行以下操作:

int mouseBufferX[mouseBufferSize] = {0};

int mouseBufferY[mouseBufferSize] = {0};

您可以在初始化列表中提供任意数量的值,并为元素分配这些值。

答案 4 :(得分:0)

有时在调试版本中,编译器会将内存初始化为已知值,以便更容易检测错误。如果您的编译器执行此操作,则应将其记录在某处。

完全由编译器自行决定,因为在这种情况下标准不保证任何初始化。

答案 5 :(得分:0)

这是一个非常危险的假设。

在一个好的编译器上你可能得到一个常量的默认值,比如最接近-infinity(编辑:或0xCCCCCCCC thx acidezombie24),否则你只会得到随机数

始终初始化变量

类似

static const int mouseBufferSize = 10;
int mouseBufferX[mouseBufferSize];
memset(mouseBufferX,0,sizeof(mouseBufferX));
int mouseBufferY[mouseBufferSize];
memset(mouseBufferY,0,sizeof(mouseBufferY));