当我声明一个大小为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'
那么“可能”是什么意思?是否依赖于实现?
答案 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 ++之间许多重要区别之一。