在C中是否可以缩小分配的内存而不移动它?

时间:2013-08-11 10:53:29

标签: c free realloc

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

谢谢!

2 个答案:

答案 0 :(得分:3)

根据对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);

这些预防措施并非一无所获,例如参见this informal undefined behavior competition中的获胜者#2。

答案 1 :(得分:-1)

据我说不,因为您必须复制到新位置然后使用free()来释放以前的位置。

这是我对你的理解。

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