为什么 malloc 在没有分配正确字节数的情况下工作?
Why does the malloc work without correct number of bytes allocated?
我有一个简单的问题,我似乎无法在任何地方找到答案。
当我为两个字符分配足够的内存时,为什么这段代码可以编译和工作,"he","hellos" 不应该适合?
它打印出正确的长度,即 6。
free没有报错
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;
}
Why does this code compile and work when i allocated enough memory for just two characters, "he", "hellos" shouldnt be able to fit?
它是 undefined behaviour 因为 strcpy()
调用溢出缓冲区。
C 标准不要求实现对 未定义 行为给出错误或警告。所以,你不能指望任何东西来拯救你;你是一个人。
如果 malloc 分配的区域后有可用内存,就会发生这种情况。
但你当然必须指望它。只相信你分配的东西。
实际上这是严重错误的来源,因为一些糟糕的代码(如 mallocing 内存不足或使用释放的内存)可以工作。然后有一天你做了一个影响内存方案的小改动,或者更新了一个编译器版本,然后事情开始崩溃......
你没有错误的唯一原因是你复制的数据量仍然可以容纳在内存页面中。如果你偶然复制了导致页面溢出的数据,你会得到一个 SIGSEGV(分段)错误。
总之,这是未定义的行为。
我有一个简单的问题,我似乎无法在任何地方找到答案。
当我为两个字符分配足够的内存时,为什么这段代码可以编译和工作,"he","hellos" 不应该适合?
它打印出正确的长度,即 6。
free没有报错
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;
}
Why does this code compile and work when i allocated enough memory for just two characters, "he", "hellos" shouldnt be able to fit?
它是 undefined behaviour 因为 strcpy()
调用溢出缓冲区。
C 标准不要求实现对 未定义 行为给出错误或警告。所以,你不能指望任何东西来拯救你;你是一个人。
如果 malloc 分配的区域后有可用内存,就会发生这种情况。
但你当然必须指望它。只相信你分配的东西。
实际上这是严重错误的来源,因为一些糟糕的代码(如 mallocing 内存不足或使用释放的内存)可以工作。然后有一天你做了一个影响内存方案的小改动,或者更新了一个编译器版本,然后事情开始崩溃......
你没有错误的唯一原因是你复制的数据量仍然可以容纳在内存页面中。如果你偶然复制了导致页面溢出的数据,你会得到一个 SIGSEGV(分段)错误。
总之,这是未定义的行为。