在C中堆积腐败

Ala*_*lan 3 c heap-corruption

int main ()
{
    int * b;
    b = (int*) malloc (1);
    *b=110000;
    free (b);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么堆腐败发生在free (b);

IMO,堆腐败已经发生在*b=110000;.

Ned*_*der 14

malloc()的参数是要分配的字节数.你需要使用:

b = (int*) malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)

你已经分配了一个太小的块,然后写了比你分配的更多的字节,这会覆盖块旁边的簿记信息,从而破坏堆.

  • 它是破坏堆的赋值,它是检测损坏的免费调用. (14认同)
  • @Edmund和@Andrey,说"这不能回答这个问题"没什么价值.如果您知道更好的答案,请在此处添加.如果您不知道答案,但发现我的答案没有提供您需要的所有内容,请提出后续问题. (2认同)

Man*_*j R 5

它在*b = 110000; 因为您为一个字节分配内存,然后为其分配一个多于一个字节的int.您可以使用b =(int*)malloc(sizeof(int))或代替int*b,您可以使用char*b然后将malloced指针强制转换为char*.如果您将小于128的值(因为有符号字符)分配给*b,则代码甚至可以工作.

编辑: - 我认为有时即使这样也没有任何麻烦.因为编译器可能会选择分配多个字节的内存来快速访问数据.


Bar*_*nau 5

堆损坏确实已经在*b=11000分配时发生,但直到调用时才检测到free(b),因为这是再次检查堆完整性的第一个点。

在每次赋值(甚至每次涉及解引用指针的赋值)时检查堆完整性都会使大多数程序速度减慢太多,并且会将编译器与库实现联系得太紧密。因此,只有当堆被操作时才会执行完整性检查,这是在mallocfree函数(以及朋友)中。