如果我运行此代码,它将崩溃堆栈转储:
int * a = (int *) malloc(sizeof(int) * 10);
a++;
free(a);
为什么不起作用?
为什么它需要malloc()
返回的指针?
它背后的资源管理系统保留了哪些记录?
它是数组的长度吗?它是最后一个小区的地址吗?它是否与起始指针相关联?
答案 0 :(得分:3)
分配存储器时,分配的存储器大小存储在与分配的块相邻的块中。
Why doesn't it work?
int * a = (int *) malloc(sizeof(int) * 10);
a++;
free(a);
这不起作用,因为,可以自由搜索具有已分配内存大小的相邻块。
Why does it need the pointer returned by malloc?
malloc返回的指针的adjecent块,包含有关已分配内存大小的信息。
答案 1 :(得分:2)
它不起作用,因为你向malloc返回给你的指针添加了一个。
free需要malloc返回的指针。由于a++
指针不再是malloc返回的,因此free不知道如何处理它。
答案 2 :(得分:1)
malloc函数在堆中保留的内存比用户告诉它的内存多一点。这是因为保存分配的块之前的唯一值,以便知道系统能够释放的内存大小和块。
int * a = (int *) malloc(sizeof(int) * 10);
当你增加指针“a”时,系统将引用一个指向的新位置,因此它会导致读取垃圾数据。
这会导致通常未定义的行为,并且通常会在运行程序时导致崩溃。
答案 3 :(得分:0)
Malloc
通常会分配比我们通常要求的数据更多的数据。此附加空间用于存储一些重要信息,例如在进行malloc
调用时分配的内存量(字节数)。有时还会保留其他信息,例如指向下一个空闲位置的指针。此信息存储在相对于malloc返回给我们的起始内存位置的特定位置。如果我们向free
函数返回一些其他地址,那么它将查看相对于传递给free
的地址中的值,并最终释放该字节数并“可能”导致崩溃。