如果我有一个嵌入的空终止符 [旁白:那是 UB 吗?],它是否明确定义了我可以访问它之后的值?
#include <stdio.h>
const char foo[] = "abc\0def";
int main() {
printf("%s", foo+4);
return sizeof(foo);
}
郑重声明,它会打印出您可能期望的内容:
def
最佳答案
嵌入的null
不是未定义的行为。它可能是一个逻辑错误,如果你使用期望字符串以 null 终止的函数。但是,无论其内容如何,访问您已成功分配的数组的全部范围都没有错、邪恶或未定义。
但要注意一件事:如果您尝试将此数据存储在 std::string
中(这是您应该如何处理所有字符串,TBH),如何您存储的字符串可能很重要。
std::string str1 = foo; //contents of str1 becomes "abc".
std::string str2 = std::string(foo, sizeof(foo)); //contents of str2 becomes "abc\0def"
关于c++ - 是否在嵌入的空终止符 UB 之后访问字符串的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46120191/