用0个元素初始化多维C数组

用0个元素初始化多维C数组,c,arrays,initialization,C,Arrays,Initialization,我如何简单地初始化一个包含0个元素的多维C数组,如下所示: int a[2][2] = { { 0, 0 }, {0, 0} } 使用memset: memset(a,0,sizeof a); 使用memset(),或者将其设为静态,并将其“惰性初始化”为零: 带有静态存储类的变量总是被初始化,就好像它们的所有字段都被设置为0一样。使用bzero将其置零(比memset快): 这应该起作用: int a[2][2] = {0}; 编辑此技巧可用于使警告静音: int a[2][2] = {

我如何简单地初始化一个包含0个元素的多维C数组,如下所示:

int a[2][2] = { { 0, 0 }, {0, 0} }
使用memset:

memset(a,0,sizeof a);
使用
memset()
,或者将其设为静态,并将其“惰性初始化”为零:

带有静态存储类的变量总是被初始化,就好像它们的所有字段都被设置为0一样。

使用bzero将其置零(比memset快):

这应该起作用:

int a[2][2] = {0};
编辑此技巧可用于使警告静音:

int a[2][2] = {{0}};

简单:在末尾添加分号:

int a[2][2] = { { 0, 0 }, {0, 0} };
而且,如果所有初始值设定项都为零且数组不是本地的,则可以完全忽略初始值设定项,因为默认值为0:

int a[2][2];

人们建议调用memset或bzero,但这与给出的问题无关。

相关:bzero似乎不是一个标准的c函数(),如果将0作为第二个参数传递,memset通常会转到bzero,因此,这可能是另一个过早优化的例子……可能会产生警告?我相信
inta[2][2]={}也应该有效吗?”保罗。我认为空括号不是一种合法的语法。另一方面,用额外的一对括号来充实0是有效的(至少在gcc领域是如此)。@Alexander:有了gcc,
{}
{{0}
,我没有得到任何警告,只有
{0}
:警告:初始化器周围缺少括号。@Jim:我相信你的话,但是gcc即使使用
gcc-Wall-Wextra-std=c99-strict…
也不会抱怨。你能给我指一下C99标准的相关部分吗?@Jim:谢谢-我很高兴听你的话,但同时我也很好奇标准中对它的描述。;-)为了避免显式初始化而使某些内容保持静态似乎是一个坏建议-线程安全性、可重入性等如何?0只是全局和静态的默认值。局部变量没有默认初始化。不,不要使用
memset
。“捕获所有初始值设定项”
{0}
保证适用于所有数据类型,即使“null”指针或
0.0
不是在所有位都设置为0的情况下实现的。@Jens Gustedt-是,但您的方式可能会根据您使用的编译器和编译器选项生成警告。memset没有遇到这些问题(请参阅Alexander Pogrebnyak回答中的注释),因此我认为这是有利的。@dcp:因为一个编译器发出虚假警告,所以不应该放弃可移植性。如果基类型是指针或浮点类型,则将所有位设置为
0
,可能没有您想要的效果。@不起作用的dcp代码并不比起作用的代码有利,但会得到警告。@dcp:我以他的代码中的
int
为例。问题本身没有提到它。从这个意义上讲,最好让编译器决定什么是合适的。在大多数情况下,它会做一些与
memset
相当的事情,但编译器更清楚它所做的事情。
int a[2][2] = {{0}};
int a[2][2] = { { 0, 0 }, {0, 0} };
int a[2][2];