通过“ \ 0”而不是memset()批量初始化char数组

Ram*_*r P 6 c c++ arrays char

通常,char数组由初始化memset

我在项目代码中发现了由初始化的char数组"\0"。我也编译检查,它工作正常。

我的问题是这是批量初始化char数组的正确方法吗?

例如:

char a[20]="\0";
printf("%s", a);
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 7

是的,这是正确的方法之一。

对于

引用C11第§6.7.9章

如果用大括号括起来的列表中的初始化程序少于聚合中的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符少于该数组中的元素,则聚合的其余部分应与具有静态存储持续时间的对象一样隐式初始化。

并且关于static存储变量的初始化,

如果未明确初始化具有静态或线程存储持续时间的对象,则:

—如果具有指针类型,则将其初始化为空指针;

—如果具有算术类型,则将其初始化为(正数或无符号)零;

—如果是集合,则根据这些规则(递归)初始化每个成员,并将任何填充初始化为零位;

—如果它是一个联合,则根据这些规则(递归地)初始化第一个命名成员,并将任何填充初始化为零位;

对于

引用C++17第§11.6.2章

如果初始化程序少于数组元素,则每个未显式初始化的元素应被零初始化。


所以,就您而言,

char a[20]="\0";
Run Code Online (Sandbox Code Playgroud)

尝试初始化a[0]'\0'a[1]'\0'(对空终止符),其余的作为0。FWIW '\0'的十进制值为0,因此在这种情况下,数组中的所有元素都将具有一个value 0

一些类似的初始化语句将是

char a[20] = "";
char a[20] = {0};
char a[20] = {'\0'};
Run Code Online (Sandbox Code Playgroud)

对于C++,如其他答案中所建议,包括所有先前的语法,

char a[20] = {};
Run Code Online (Sandbox Code Playgroud)

也可以。


Bat*_*eba 6

在我看来,它几乎以一种奇怪的方式偶然地起作用,并且在混淆中是一种练习。一个解释:

在C ++中,"\0"是一个const char[2]带值'\0'(八进制常数值为0)后跟NUL终止符(即均为0值)的文字。在C中,它是一个char[2]具有相同值的常数。

初始化a到也导致的其它元件a被初始化为0太(由C和C ++标准,其它元件被初始化为每static存储持续时间)。

在C ++中编写char a[20] = {}就足够了,在C中至少需要char a[20] = {0}