我一直在重构一些代码,我注意到一些涉及未初始化的int数组的不良行为:
int arr[ARRAY_SIZE];
我设置了一个断点,似乎所有值都默认为-858993460。这个价值有什么特别之处吗?任何想法为什么他们不默认为0?
答案 0 :(得分:17)
C ++中没有“默认” - 在您的代码初始化之前,变量和数组元素将包含最后一个内存中的内容。
换句话说,当声明这些变量时,内存中的空间被保留供它们使用。从上次使用内存时遗留的内存中的位仍然存在,导致您的变量最初看起来好像被“垃圾”填充。内存并不总是立即归零的原因是速度 - 将内存清零需要时间。
您可以使用循环初始化数组,或使用此技巧(存在可读性较低的风险):
int mouseBufferX[mosueBufferSize] = { 0 };
这是有效的,因为当您使用值列表来初始化数组时,并且文字值少于数组中元素的数量,其余元素总是初始化为0.
答案 1 :(得分:14)
-858993460是十六进制的CCCCCCCC,Visual Studio在DEBUG MODE中将其置为默认值。这是为了让您更容易注意到您忘记初始化变量。在发布模式下,它可以是任何东西。
我实际上不确定为什么mouseBufferX
不是10个项目的元素(如果它确实编译而且不是10个元素)。但我很确定该标准说静态非静态之前初始化静态。无论如何,我个人讨厌使用define
和const
来声明整数。改为使用枚举。
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));