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

C 为什么free()需要动态数组的起始指针?,c,pointers,free,C,Pointers,Free,如果我运行此代码,它将因堆栈转储而崩溃: int * a = (int *) malloc(sizeof(int) * 10); a++; free(a); 为什么不起作用? 为什么它需要malloc()返回的指针? 其背后的资源管理系统保存哪些记录? 是数组的长度吗?这是最后一个牢房的地址吗?它是否将它与起始指针相关联?它不起作用,因为您向malloc返回给您的指针添加了一个指针 free需要malloc返回的指针。由于a++指针不再是malloc返回的指针,因此free不知道如何处理它。它

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

int * a = (int *) malloc(sizeof(int) * 10);
a++;
free(a);
为什么不起作用? 为什么它需要malloc()返回的指针? 其背后的资源管理系统保存哪些记录?
是数组的长度吗?这是最后一个牢房的地址吗?它是否将它与起始指针相关联?

它不起作用,因为您向malloc返回给您的指针添加了一个指针


free需要malloc返回的指针。由于
a++
指针不再是malloc返回的指针,因此free不知道如何处理它。

它不起作用,因为您向malloc返回给您的指针添加了一个指针


free需要malloc返回的指针。由于
a++
指针不再是malloc返回的指针,因此free不知道如何处理它。

分配内存时,分配内存的大小存储在与分配块相邻的块中

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返回的指针的相邻块具有有关分配内存大小的信息。

分配内存时,分配内存的大小存储在与分配块相邻的块中

Why doesn't it work?
int * a = (int *) malloc(sizeof(int) * 10);
a++;
free(a);
Why does it need the pointer returned by malloc?
这将不起作用,因为空闲搜索具有分配内存大小的相邻块

Why does it need the pointer returned by malloc?

malloc返回的相邻指针块包含有关分配内存大小的信息。

malloc函数在堆中保留的内存比用户告诉它的内存多一点。这是因为在保存分配的块之前有一个唯一的值,以便知道系统能够释放的内存大小和块数

Why does it need the pointer returned by malloc?
int * a = (int *) malloc(sizeof(int) * 10);
当您增加指针“a”时,系统将引用a所指向的新位置,因此它将导致读取垃圾数据


这通常会导致未定义的行为,并在运行程序时导致崩溃。

malloc函数在堆中保留的内存比用户告诉它的内存多一点。这是因为在保存分配的块之前有一个唯一的值,以便知道系统能够释放的内存大小和块数

int * a = (int *) malloc(sizeof(int) * 10);
当您增加指针“a”时,系统将引用a所指向的新位置,因此它将导致读取垃圾数据


这通常会导致未定义的行为,并在运行程序时导致崩溃。

Malloc
通常会分配比我们通常请求的更多的数据。这个额外的空间用于存放一些重要信息,例如在进行
malloc
调用时分配的内存量(字节数)。有时,还保留其他信息,例如指向下一个空闲位置的指针。该信息存储在相对于malloc返回给我们的起始内存位置的特定位置。如果我们将其他地址返回给
free
函数,那么它将查看地址中与传递给
free
的内容相关的值,并最终释放该数量的字节,“可能”导致崩溃。

Malloc
通常会分配比我们通常请求的更多的数据。这个额外的空间用于存放一些重要信息,例如在进行
malloc
调用时分配的内存量(字节数)。有时,还保留其他信息,例如指向下一个空闲位置的指针。该信息存储在相对于malloc返回给我们的起始内存位置的特定位置。如果我们向
free
函数返回其他地址,那么它将查看地址中与传递给
free
的内容相关的值,并最终释放该字节数,“可能”导致崩溃。

是否有错误?如果是,你能说明为什么它会工作吗?C的行为一直是指向
free()
的指针必须由
malloc()
calloc()
realloc()
或其任何兄弟(
posix\u memalign()
aligned\u alloc()
等)返回。如果您想编写自己的内存分配系统,您可以这样做,但是标准版本的工作原理是这样的,询问原因并没有真正的好处——这是它定义的行为方式。也许这个问题的答案对你有帮助。有什么错误吗?如果是,你能说明为什么它会工作吗?C的行为一直是指向
free()
的指针必须由
malloc()
calloc()
realloc()
或其任何兄弟(
posix\u memalign()
aligned\u alloc()
等)返回。如果您想编写自己的内存分配系统,您可以这样做,但是标准版本的工作原理是这样的,询问原因并没有真正的好处——这是它定义的行为方式。也许这个问题的答案会有所帮助you@user2603656:因为这是它设计和指定的行为方式。为什么天空是蓝色的?@user2603656如果你正在学习测试或其他东西,因为free()知道你返回到它的指针,在与该指针的某个特定偏移处,它会获取分配块的头信息。它将以该偏移量结束,并修改标题以表示块现在是自由的。然后它将把它放在自由列表中(取决于它们的实现)。@user2603656:因为这是它设计和指定的行为方式。为什么天空是蓝色的?@user2603656如果你正在学习测试或其他东西,因为free()知道你返回到它的指针,在与该指针的某个特定偏移处,它会获取分配块的头信息。它将根据该偏移量进行调整,并修改标题以表示blo