如果我将char数组初始化为零/ {0},是否必须将null终止?

时间:2020-10-20 07:35:08

标签: arrays c initialization c-strings null-terminated

例如,我声明了一个char数组,其所有值都以以下方式设置为零:

char array[4] = {0};

如果我为其分配值,例如:

array[0] = 'A';
array[1] = 'B';
array[2] = 'C';

我是否需要像这样终止数组的空值?:

array[3] = '\0';

或者char array[4] = {0}空操作是否在任何分配之前终止?

2 个答案:

答案 0 :(得分:5)

我是否需要像这样终止数组的空值?

不。 '\0'只是一种写0的奇特方式。这是一种过时的方式,专门用于编写引用空终止符的自文档代码。 (实际上,这只是写为八进制转义序列的所有零。)

由于您已经将所有项目都设置为0,因此不需要额外的\0

答案 1 :(得分:3)

此声明

char array[4] = {0};

等同于

char array[4] = { 0, 0, 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
相关问题