为什么malloc在没有正确分配的字节数的情况下工作?

时间:2017-01-15 19:05:38

标签: c string malloc c-strings

我有一个简单的问题,我似乎无法在任何地方找到答案。

当我为两个字符分配足够的内存时,为什么这段代码会编译和工作,"他"," 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;
}

3 个答案:

答案 0 :(得分:2)

  

为什么这个代码编译和工作时,我只为两个字符分配了足够的内存,“他”,“hellos”不适合?

undefined behaviour因为== Nothing调用溢出缓冲区。

C标准不要求实现为 undefined 行为提供错误或警告。所以,你不能指望任何东西来拯救你;你是独立的。

答案 1 :(得分:1)

如果在malloc分配的区域之后有空闲内存,则会发生这种情况。

但当然你必须指望它。只信任你分配的东西。

实际上这是一个令人讨厌的错误的来源,因为一些不好的代码,如mallocing内存不足或使用释放的内存可以工作。然后有一天你做了一个影响内存方案的小改动,或更新编译器版本,事情开始崩溃...

答案 2 :(得分:1)

您没有错误的唯一原因是您复制的数据量仍然可以放在内存页面中。如果您偶然复制导致页面溢出的数据,则会出现SIGSEGV(分段)错误。

总之,这是未定义的行为。