字符数组初始化和尾随空值

Character array initialization and trailing null

本文关键字:空值 数组 初始化 字符      更新时间:2023-10-16

当我声明大小为 2 的 char 数组并为其分配数据时,何时有尾随的"\0"(空字符)?

我知道那件事:

char data[2] = {'a', 'b'}; // array holds 'a', 'b'

我也知道

char data[] = "ab"; // array holds 'a', 'b', ''

但是,我想知道这是做什么的?

char data[2] = "ab"; // Is there a trailing ''?

我一直认为这是一个错误,但是查看cpp首选项它说:

如果数组的大小已知,则它可能比字符串文本的大小小 1,在这种情况下,将忽略终止 null 字符:

char str[3] = "abc"; // str has type char[3] and holds 'a', 'b', 'c'

那么"可能"是什么意思呢?它是否依赖于实现?

不,在C++中,您必须始终为 NUL 终止符腾出空间:

char str[3] = "abc";

需要发出诊断程序。

在 C 中,你可以用"它被允许"代替 may,确实如此

char str[3] = "abc";

是允许的,但不复制 NUL 终止符。

这是 C 和 C++ 之间的众多重要区别之一。

导致数组溢出的声明甚至无法在MSVC,GCC或Clang上编译:

a value of type "const char [3]" cannot be used to initialize an entity of type "char [2]"  
error: initializer-string for char array is too long

等。