字符指针的行为
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。
我真的很困惑以下几点:
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。