c - 字符指针的行为

标签 c arrays pointers buffer-overflow

<分区>

我真的很困惑以下几点:

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

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

我的预期是某种未定义的行为,因为 list 仅具有 1 个字符“对象”的内存。

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

最佳答案

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

  list[1] = 'b';

是越界访问,调用 undefined behavior .导致 UB 的程序不能有任何期望。它可以做任何,绝对是任何

也就是说,

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

关于c - 字符指针的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41149693/

相关文章:

c - 在同一头文件中声明函数指针之后使用 extern 的优点

c - 如何将字符串中的指针值传递给指针

javascript - SomeArray.sort ( function() { ... } ) 语句背后的逻辑是什么?

c - 为什么以及如何运作?

ios - 用于 CFunctionPointer 到 Swift 闭包的 Objective-C 包装器

c - Serpent 和 Twofish 库 C

c - 了解内存分配和核心转储错误

arrays - Numpy - 索引多维数组的一维

javascript - 如何从javascript中的对象计算新数据

c - 带 void 的动态数组内存分配**