问题描述
例如,我声明了一个char数组,其所有值都以以下方式设置为零:
char array[4] = {0};
如果我为其分配值,例如:
array[0] = 'A';
array[1] = 'B';
array[2] = 'C';
我是否需要像这样终止数组的空值?:
array[3] = '\0';
或者char array[4] = {0}
空操作是否在任何分配之前终止?
解决方法
我是否需要像这样终止数组的空值?
不。 '\0'
只是一种写0
的奇特方式。这是一种过时的方式,专门用于编写引用空终止符的自文档代码。 (实际上,这只是写为八进制转义序列的所有零。)
由于您已经将所有项目都设置为0
,因此不需要额外的\0
。
此声明
char array[4] = {0};
等同于
char array[4] = { 0,0 };
根据C标准(6.7.9初始化)
19初始化应以初始化列表的顺序进行,每个 为覆盖所有子对象的特定子对象提供的初始化程序 先前列出的同一子对象的初始化程序; 151)全部 未显式初始化的子对象应被初始化 与具有静态存储持续时间的对象隐式相同。。
和
10如果具有自动存储持续时间的对象未初始化 显然,它的值是不确定的。 如果对象具有静态 或未明确初始化线程存储持续时间,则:
-如果具有算术类型,则将其初始化为(正或 无符号)零; —如果是聚合,则每个成员都将被初始化(递归) 根据这些规则,任何填充都初始化为零位; ...
因此元素array [3]包含0。在被覆盖之前,该数组包含一个字符串。
以下是通过字符数组的零初始化的另一种选择
char array[4] = "";
或以下
char array[4] = { "" };
甚至以下
char array[] = { [3] = '\0' };
这是一个演示程序。
#include <stdio.h>
int main(void)
{
char array[] = { [3] = '\0' };
array[0] = 'A'; // the array contains a string
printf( "%s\n",array );
array[1] = 'B'; // the array contains a string
printf( "%s\n",array );
array[2] = 'C'; // the array contains a string
printf( "%s\n",array );
array[3] = 'D'; // the array does not contain a string
printf( "%.*s\n",( int )sizeof( array ),array );
return 0;
}
程序输出为
A
AB
ABC
ABCD