我对以下内容感到困惑:
char *list = malloc(sizeof(char));
list[0] = 'a';
list[1] = 'b';
printf("%s\n", list);
我的期望是某种未定义的行为,因为list
只有1个字符“对象”的内存。
但实际输出为ab
。当list[1]
仅为一个字符分配内存时,为什么可以访问list
?
答案 0 :(得分:3)
根据您的内存分配sizeof(char)
个字节(并考虑分配成功),
list[1] = 'b';
是越界访问,调用undefined behavior。导致UB的程序不能有期望。它可以任何,绝对任何。
那就是说,
sizeof(char)
在C标准中被定义为(保证)为1
。malloc()
是否成功。否则,第一次访问list[0]
本身将调用UB,因为您最终会取消引用无效指针(,即访问无效内存)char
的参数传递给非空终止的%s
数组也会调用UB。