首页 > 解决方案 > 在数组的最后一个元素之后将 '\0' 放入 char[] 是否安全?

问题描述

出于一些实际原因,我很感兴趣。我知道 C++'\0'在最后一个元素之后添加,但是手动放置它是否安全?我听说过undefined behavior,但是我很感兴趣,如果NULL字符实际上是记忆中的下一个符号?

UPD:我明白了,如果没有代码片段,我的问题还不够清楚。所以,我在问这是否真的可以保存并且不会导致未定义的行为?

const char* a = "Hello";
a[5] = '\0'; //this is wrong, will not compile on most compilers

char* b = new char[5];
b[5] = '\0';

char c[5];
c[5] = '\0';

标签: c++arrayscinitializationc-strings

解决方案


我知道 C++ 在最后一个元素之后添加了 '\0'

这不是真的;至少缺少上下文,或者最坏的情况是误解。字符串文字末尾有一个隐式的空终止符。字符串文字的隐式空终止符是数组的一部分。虽然它字符串的最后一个字符之后,但它不在数组的最后一个元素之后;终结符数组的最后一个元素。例如,字符串文字""是一个包含一个元素(空终止符)"a"的数组,而字符串文字是一个包含两个元素('a' 和空终止符)的数组。"\0"是一个包含两个元素(两个空终止符)的数组。

除了字符串文字之外,没有其他数组具有隐式空终止符。

在数组的最后一个元素之后将 '\0' 放入 char[] 是否安全?

在数组边界之外读取或写入内存的行为是未定义的。这是安全的反面。


const char* a = "Hello";
a[5] = '\0';

不允许通过指向 const 的指针进行赋值。该程序格式错误,如果编译器拒绝接受该程序,这是安全的。

char* b = new char[5];
b[5] = '\0';
char c[5];
c[5] = '\0';

索引 5 超出了数组的范围。行为未定义。很不安全。


推荐阅读