c++ - 在数组的最后一个元素之后将 '\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++ 在最后一个元素之后添加了 '\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 超出了数组的范围。行为未定义。很不安全。
推荐阅读
- swift - 由于“内部”保护级别,初始化程序不可访问
- javascript - 如何使用 setState 更改嵌套对象之一
- context-free-grammar - 我如何获得这种语言的上下文无关语法?
- vba - 使用字典获取唯一值 - 想了解更多
- ipados - 在深色模式下使用 PencilKit 会导致颜色错误
- c++ - 打印逐行存储的文本文件
- git - Git 要求我跟踪我的整个用户文件
- python-3.x - 在 Python 中删除空格并提取特定字符之间的文本
- c# - 如何在 ASP.NET Core 控制器上允许 /(斜线)?
- pine-script - PineScript / 交易视图:如何在策略中检查未结订单