初始化数组为0的正确且简单句法方式是什么?

4

我正在尝试找到正确的方法将数组初始化为全零(即像在数组上执行memset一样)。

我从stackoverflow(和其他来源)的各个领域中找到了以下方法:

char myArray1[10] = {0};
char myArray2[10] = {0,};
char myArray3[10] = {[0 ... 9] = 0};
char myArray4[10] = {0,0,0,0,0,0,0,0,0,0};

我更倾向于使用最简单的语法变体... 我一直在使用 {0},但我没有找到任何证据证明这是正确的。


是的,它们似乎都是这样。但正如我所提到的,我没有找到证明它实际上是正确的! - code_fodder
1
这篇帖子看起来和这个很相似:https://dev59.com/0HVC5IYBdhLWcg3wtzut - user1990
非常相似...但仅适用于C。尽管答案似乎涵盖了C ++。 - code_fodder
1
@code_fodder,你链接的文章明确说明这是一个扩展,而不是C++标准的一部分。 - Konrad Rudolph
@KonradRudolph 很正确! - code_fodder
显示剩余4条评论
3个回答

5

数组中缺失的元素将被初始化为0。此外,C ++ 允许您将统一初始化器留空。因此,以下内容有效,最小化且效率最高:

T array[N] = {};

值得注意的是,这适用于任何可以默认构造或初始化的类型T,而不仅仅是内置类型。例如,以下内容也可以正常工作,并将打印出五次foo
#include <iostream>

struct foo {
    foo() { std::cout << "foo()\n"; }
};

int main() {
    foo arr[5] = {};
}

之前aib发布了更加详细的不同可能性列表


感谢您详细的回答和思考 :) - code_fodder

2

根据C++规范中的“聚合初始化”(8.5.1):

如果初始化列表中的初始化器少于聚合体中的成员数量,则未显式初始化的每个成员都将从空初始化器列表中初始化。

因此,初始化列表中没有的每个char都会被初始化为char(),即0

在C++11中,您可以键入:

char a[10] = {};
char b[10]{};

一些旧的编译器(或者是C语言)可能需要您至少添加一个成员:

char a[10] = {0};

如果数组具有静态生存期(全局或静态变量),则在没有初始化程序的情况下,它将被零初始化:

char global_array[10];

我觉得这很令人困惑,所以我更喜欢无论如何都加上 = {}

关于尾随逗号,如果你做了类似以下的操作,它会很有用:

char a[] = {
  1,
  2,
  3,
};

为了避免您为最后一行做特殊处理,使复制、粘贴和比对更加容易。在您的具体情况下是没有用处的:
char a[10] = {0,};

那个逗号没有任何作用,而且很难看,所以我不会写它。

1
谢谢您的规格报价 :) - code_fodder
1
“在C++98中,你确定吗?” - Konrad Rudolph
哈哈...我想是99 :) - code_fodder
@KonradRudolph:不,我不确定。我认为它可能是C99,而不是C++98。那是很久以前的事了……我会删掉这句话。 - rodrigo

1
我更喜欢这种方式,因为它简单明了:

char myArray1[10] = { 0 };

2
最好将0移除,因为人们可能会看到它并认为{1}会将其填充为1。 - Neil Kirk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接