为什么free()需要动态数组的起始指针?

时间:2013-12-18 05:20:55

标签: c pointers free

如果我运行此代码,它将崩溃堆栈转储:

int * a = (int *) malloc(sizeof(int) * 10);
a++;
free(a);

为什么不起作用? 为什么它需要malloc()返回的指针? 它背后的资源管理系统保留了哪些记录? 它是数组的长度吗?它是最后一个小区的地址吗?它是否与起始指针相关联?

4 个答案:

答案 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的地址中的值,并最终释放该字节数并“可能”导致崩溃。