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



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

谢谢!

根据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。

2021年版:然而,多年后,将C的定义重新解释和发展为高级语言的定义意味着,即使上述三行都是完全合法的,即使在执行它们之后,你也不能使用old的旧副本来访问new指向的块,即使这些指针指向同一个地方。请参阅当前关于C.中指针出处的论文

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

这就是我从你的问题中理解的。

请提出明确的问题。我所理解的是@JsQuareD也从你的问题中所理解的。

最新更新