在C语言中,是否可以在不移动内存的情况下缩小分配的内存?

在C语言中,是否可以在不移动内存的情况下缩小分配的内存?,c,free,realloc,C,Free,Realloc,是否有一种方法/函数可以释放内存,而不可能将其移动到c中的新指针 谢谢 根据我的说法,没有,因为您必须复制到新位置,然后使用free()释放以前的位置 这是我从你的问题中了解到的 请给出明确的问题。我理解的是@JsQuareD也从您的问题中理解的内容 根据C99标准的严格解释,对realloc()的任何调用,包括减小分配块的大小,都可能返回与参数不同的指针。事实上,根据对该标准的严格解释,不允许将旧指针与新指针进行比较,因为将旧指针传递到realloc()会导致其所有现有副本不确定 reallo

是否有一种方法/函数可以释放内存,而不可能将其移动到c中的新指针


谢谢

根据我的说法,没有,因为您必须复制到新位置,然后使用free()释放以前的位置

这是我从你的问题中了解到的


请给出明确的问题。我理解的是@JsQuareD也从您的问题中理解的内容

根据C99标准的严格解释,对
realloc()
的任何调用,包括减小分配块的大小,都可能返回与参数不同的指针。事实上,根据对该标准的严格解释,不允许将旧指针与新指针进行比较,因为将旧指针传递到
realloc()
会导致其所有现有副本不确定

realloc函数解除分配ptr指向的旧对象,并返回 指向新对象的指针,该对象的大小由size…指定…(C99 7.20.3.4:2)


但是,我的系统上的
realloc()
手册页显示:

如果没有足够的空间 放大ptr指向的内存分配,realloc()创建一个新的 分配,复制ptr所指向的尽可能多的旧数据 到新分配,释放旧分配,并返回指向的指针 分配的内存

这或多或少意味着realloc()在用于放大块时只能移动数据并返回新指针。这表明在这个平台上,
realloc()
可以用来减小从
malloc()
获得的块的大小,而不会有移动它的风险

如果我要使用
realloc()
减少分配块的大小而不移动它,我会使用下面的检查:

uintptr_t save = old;
void * new = realloc(old, …);
assert (save == (uintptr_t) new);

这些预防措施并非毫无意义,例如,请参见中的Winner#2。

您到底想实现什么?如果您不再需要分配内存的某些部分(以及某些变量),只需释放这些变量即可。@JSQuareD:我想OP希望避免realloc()可能带来的复制开销。有些实现不会移动数据,除非较小的数据块能够合理地容纳它(它必须能够生长一点,否则就不值得移动,因为当它再次变大时,只会被移回去)。如果它不移动您的数据,它只会将额外的空闲字节添加到空闲列表中,并将您的数据保持在相同的地址。我唯一可以添加的是比较指针是多么的毫无意义。如果
realloc
返回
NULL
,则旧指针不会更改。否则,新指针就是应该更改的指针已使用。赋值比分支和可能的赋值快,因此在确保新指针不为
NULL
后,只需将新指针分配给旧指针即可。如果为NULL,则数据仍在旧指针中,并且可以安全地访问,尽管未调整其大小。在这种情况下,您所做的操作取决于上下文and重新分配的意图。@ChronoKitsune if(new!=old){更新旧指针的多个副本}是一种习语,有时可以在现有代码中看到。我不是对它的值采取立场,我只是说它存在,而且在技术上是未定义的行为。如果有另一个变量指向同一地址,那将是realloc之后的工作。你会盲目地将所有这些指针分配给新指针,因为它们会无论如何,uld都是无效的。执行赋值操作应该不会花费太多。如果是,我赞成在可能的情况下多进行一级间接寻址,以避免此类更新。这样,将新指针赋值给旧指针会更新其他副本,因为它们将指向旧指针的地址,而不是相同的地址这是旧指针曾经指向的。