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)
你已经分配了一个太小的块,然后写了比你分配的更多的字节,这会覆盖块旁边的簿记信息,从而破坏堆.
它在*b = 110000; 因为您为一个字节分配内存,然后为其分配一个多于一个字节的int.您可以使用b =(int*)malloc(sizeof(int))或代替int*b,您可以使用char*b然后将malloced指针强制转换为char*.如果您将小于128的值(因为有符号字符)分配给*b,则代码甚至可以工作.
编辑: - 我认为有时即使这样也没有任何麻烦.因为编译器可能会选择分配多个字节的内存来快速访问数据.
堆损坏确实已经在*b=11000分配时发生,但直到调用时才检测到free(b),因为这是再次检查堆完整性的第一个点。
在每次赋值(甚至每次涉及解引用指针的赋值)时检查堆完整性都会使大多数程序速度减慢太多,并且会将编译器与库实现联系得太紧密。因此,只有当堆被操作时才会执行完整性检查,这是在malloc和free函数(以及朋友)中。