int main ()
{
    int * b;
    b = (int*) malloc (1);
    *b=110000;
    free (b);
    return 0;
}

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

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

有帮助吗?

解决方案

malloc()的论点是要分配的字节数。您需要使用:

b = (int*) malloc(sizeof(int));

您已经分配了一个块,然后将其写入比分配的更多字节,后者覆盖了块旁边的簿记信息,从而破坏了堆。

其他提示

它在 *b = 110000;因为您是为一个字节分配内存,然后将一个int分配到一个字节中,这是一个以上的字节。要么您可以拥有b =(int *)malloc(sizeof(int)),要么代替int *b可以拥有char *b,然后将绿头夹指针施放为char *。如果您将小于128(由于签名的char)分配给 *b的值(由于签名字符)分配一个值,则该代码甚至可以工作。

编辑: - 我认为有时甚至会毫无麻烦。因为编译器可以选择分配一个以上的内存字节以快速访问数据。

堆确实已经发生在 *b=11000 作业,但直到 free(b) 致电是因为这是再次检查堆的完整性的第一个点。

在每个作业中检查堆的完整性(甚至涉及涉及脱水指针的每项任务)都会放慢大多数程序的速度太大,并且它将编译器与库实施相关。因此,仅在堆被操纵时才执行完整性检查 mallocfree 功能(和朋友)。

该代码将更多的数据写入内存块,而不是可用的空间,因此破坏了下一个有效内存块的开始。

使用char *而不是int *并将值-128至127的值编写为 * b应该修复它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top