int main ()
{
int * b;
b = (int*) malloc (1);
*b=110000;
free (b);
return 0;
}
为什么堆损坏发生在free (b);
?
IMO,堆损坏已经发生在*b=110000;
。
答案 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)
调用之前不会检测到,因为这是再次检查堆完整性的第一个点。
检查每个赋值的堆完整性(甚至每个涉及解除引用指针的赋值)都会使大多数程序的速度降低太多,并且会使编译器与库实现过于紧密。因此,完整性检查仅在堆被操纵时执行,即malloc
和free
函数(和朋友)。
答案 3 :(得分:0)
代码将更多数据写入内存块而不是可用空间,从而破坏下一个有效内存块的启动。
使用char *而不是int *并将值-128到127写入* b应该修复它。
答案 4 :(得分:0)
您的值为 110000 --> 0x01ADB0 --> 3 bytes
。您正在将 3 个字节的数据写入您从堆中请求的 1 个字节中。
了解 malloc 对参数 1 执行的操作以及您将哪些内容放入此内存中很重要。
malloc()
分配 size 字节并返回指向已分配内存的指针。
另外不要忘记在使用之前测试你的指针,并初始化你的局部变量。