c++ - 是否在嵌入的空终止符 UB 之后访问字符串的一部分?

标签 c++ undefined-behavior

如果我有一个嵌入的空终止符 [旁白:那是 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/

相关文章:

rust - 为什么Rust不允许可变别名?

c - memcpy 别名 int 到 char 产生 UB?

c++ - 在 OpenCV 中使用网络摄像头捕获 2 个非连续帧

c++ - 为什么 std::tuple 和模板派生类的模板参数推导/替换失败?

c++ - 在类的私有(private)部分声明一个数组,并在构造函数中分配数组值

c++ - 插入排序算法在放入函数时表现不同

c++ - operator new() 可以在构造函数运行之前初始化 POD 吗?

C 未经检查的函数返回未定义的行为

c++ - 在 QApplication 中使用可视化检漏仪

c++ - cpp 中的奇怪作用域