<分区>
我真的很困惑以下几点:
char *list = malloc(sizeof(char));
list[0] = 'a';
list[1] = 'b';
printf("%s\n", list);
我的预期是某种未定义的行为,因为 list
仅具有 1 个字符“对象”的内存。
但实际输出是ab
。当 list
只为一个字符分配内存时,为什么我可以访问 list[1]
?
<分区>
我真的很困惑以下几点:
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,因为您最终将取消引用无效指针(即访问无效内存)char
数组的指针作为参数传递给 %s
也会调用 UB。关于c - 字符指针的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41149693/