C++ 为什么我的空数组不是空的?

C++ 为什么我的空数组不是空的?,c++,c,xcode,C++,C,Xcode,我编写以下代码并在xcode中设置断点: #include <iostream> using namespace std; int main(int argc, const char * argv[]) { int array[12]; return 0; //Set breakpoint here } #包括 使用名称空间std; int main(int argc,const char*argv[] { int数组[12]; 返回0;//在此处设置

我编写以下代码并在xcode中设置断点:

#include <iostream>
using namespace std;
int main(int argc, const char * argv[])
{
    int array[12];
    return 0;        //Set breakpoint here
}
#包括
使用名称空间std;
int main(int argc,const char*argv[]
{
int数组[12];
返回0;//在此处设置断点
}


调试器面板显示前6个元素包含非零
int
s。这是为什么?

< p> C++编译器不初始化变量,除非你告诉它。< /p> 因为你的数组是“强”>未初始化< <强> >。“调试器”面板将显示存储在该位置的上一个值

因为您只声明了数组,而没有初始化它


当你声明时,唯一发生的事情就是你保留了一定的内存区域。已存储在该区域的内容可以是其他操作/程序留下的任何内容。

只有全局和静态变量(包括数组)的初始值为零。对于本地数组(如代码中所示),可以使用以下命令将其初始化为零:

int array[12] = {0};
有关详细信息,请查看此链接:

这声明了一个包含12个元素的数组,而不是空数组

此外,它声明它们时没有初始值设定项,这(在函数范围内)意味着它们将被默认初始化。对于
int
,这意味着不执行初始化,结果
int
s将具有不确定的值。此行为在C++规范中定义。 如果要对数组进行零初始化,则需要为其指定一个初始值设定项:

int array[12] = {};

这不是强制行为的原因是初始化会带来性能损失,并且一些程序被编写为可以正常工作而不需要受到惩罚。

这不是一个声明,而是一个定义,声明不保留内存,它只告诉编译器将在其他地方保留内存。这取决于变量的类型和上下文。也就是说,如果创建一个包含空构造函数的对象数组,它们会被构造吗?是的,这是告诉编译器初始化变量的一种方法。数组永远不会是空的。你想问的是,为什么会在其中得到非零值。是这样吗:“而且它声明它们时没有初始值设定项,这(在函数范围内)意味着它们将被默认初始化。”?@DieterLücking Yep;参见规范中的8.5/11。8.5还定义了默认初始化、值初始化、零初始化等,只是为了完成C的答案,因为也有一个C标记。在C中,{}不是有效的初始值设定项。您必须在那里使用
{0}
。@JensGustedt现在是2021年,我们“被引导相信”
int arr[]={}
是“空”数组的有效初始化吗?请告知?(
https://godbolt.org/z/Pj1ae3P6x
)ps:是的,我在“数组归零”的上下文中看不太清楚。@ChefGladiator、零大小数组和空的
{}
初始值设定项是gcc扩展,clang似乎也采用了它。
int array[12] = {};