我有一个简单的问题,我似乎无法在任何地方找到答案。
当我为两个字符分配足够的内存时,为什么这段代码会编译和工作,"他"," hellos"不应该适合吗?
打印出正确的长度,即6。
免费没有错误。
char* testF() {
char *arr = (char*)malloc(2*sizeof(char));
strcpy(arr, "hellos");
return arr;
}
int main() {
char *arr = testF();
printf("%c%c%c%c%c%c\n", arr[0], arr[1], arr[2], arr[3], arr[4], arr[5]);
printf("Length = %d", strlen(arr));
free(arr);
return 0;
}
答案 0 :(得分:2)
为什么这个代码编译和工作时,我只为两个字符分配了足够的内存,“他”,“hellos”不适合?
undefined behaviour因为== Nothing
调用溢出缓冲区。
C标准不要求实现为 undefined 行为提供错误或警告。所以,你不能指望任何东西来拯救你;你是独立的。
答案 1 :(得分:1)
如果在malloc分配的区域之后有空闲内存,则会发生这种情况。
但当然你必须指望它。只信任你分配的东西。
实际上这是一个令人讨厌的错误的来源,因为一些不好的代码,如mallocing内存不足或使用释放的内存可以工作。然后有一天你做了一个影响内存方案的小改动,或更新编译器版本,事情开始崩溃...
答案 2 :(得分:1)
您没有错误的唯一原因是您复制的数据量仍然可以放在内存页面中。如果您偶然复制导致页面溢出的数据,则会出现SIGSEGV(分段)错误。
总之,这是未定义的行为。