在C中堆积腐败

时间:2010-10-13 11:51:59

标签: c heap-corruption

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

为什么堆损坏发生在free (b);

IMO,堆损坏已经发生在*b=110000;

5 个答案:

答案 0 :(得分:14)

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

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

堆损坏确实在*b=11000赋值时发生,但在free(b)调用之前不会检测到,因为这是再次检查堆完整性的第一个点。

检查每个赋值的堆完整性(甚至每个涉及解除引用指针的赋值)都会使大多数程序的速度降低太多,并且会使编译器与库实现过于紧密。因此,完整性检查仅在堆被操纵时执行,即mallocfree函数(和朋友)。

答案 3 :(得分:0)

代码将更多数据写入内存块而不是可用空间,从而破坏下一个有效内存块的启动。

使用char *而不是int *并将值-128到127写入* b应该修复它。

答案 4 :(得分:0)

您的值为 110000 --> 0x01ADB0 --> 3 bytes。您正在将 3 个字节的数据写入您从堆中请求的 1 个字节中。

了解 malloc 对参数 1 执行的操作以及您将哪些内容放入此内存中很重要。

malloc() 分配 size 字节并返回指向已分配内存的指针。 另外不要忘记在使用之前测试你的指针,并初始化你的局部变量。