字符数组初始化和结尾为null

时间:2019-02-01 16:22:35

标签: c++

当我声明一个大小为2的char数组并向其分配数据时,是否存在尾随的'\ 0'(空字符)?

我知道:

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

我也知道

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

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

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

我一直认为这是一个错误,但是查看cppreference 它说:

  

如果知道数组的大小,则它可以小于字符串文字的大小,在这种情况下,终止的空字符将被忽略:

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

那么“可能”是什么意思?是否依赖于实现?

2 个答案:

答案 0 :(得分:5)

可能导致数组溢出的声明甚至无法在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

等等。

答案 1 :(得分:5)

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

char str[3] = "abc";

需要发出诊断。

在C语言中,您可以用“允许存在”代替 may ,甚至

char str[3] = "abc";
允许

,并且不复制NUL终止符。

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