字符指针的行为

Behavior of char pointer

我真的很困惑以下几点:

char *list = malloc(sizeof(char));

list[0] = 'a';
list[1] = 'b';
printf("%s\n", list);

我的预期是某种未定义的行为,因为 list 只有 1 个字符的内存 "object"。

但实际输出是ab。为什么我可以访问 list[1]list 只分配了一个字符的内存?

根据您的 sizeof(char) 字节内存分配(并考虑分配成功),

  list[1] = 'b';

是越界访问,调用undefined behavior。导致 UB 的程序不能有 expectation。它可以任何事情,绝对任何事情

也就是说,

  • sizeof(char) 在 C 标准中定义(保证)为 1
  • 在使用 return 值之前检查 malloc() 是否成功。否则,第一次访问 list[0] 本身将调用 UB,因为您最终将取消引用无效指针(即访问无效内存
  • 将指向非空终止 char 数组的指针作为参数传递给 %s 也会调用 UB。