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

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

谢谢!

最佳答案 根据对C99标准的严格解释,对realloc()的任何调用(包括减小分配块的大小)都可以返回与参数不同的指针.实际上,根据对标准的严格解释,不允许将旧指针与新指针进行比较,因为将旧指针传递给realloc()会使其所有现有副本都不确定.

The realloc function deallocates the old object pointed to by ptr and returns a
pointer to a new object that has the size specified by size. … (C99 7.20.3.4:2)

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

If there is not enough room to
enlarge the memory allocation pointed to by ptr, realloc() creates a new
allocation, copies as much of the old data pointed to by ptr as will fit
to the new allocation, frees the old allocation, and returns a pointer to
the allocated memory.

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

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

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

这些预防措施并非一无是处,例如参见this informal undefined behavior competition中的Winner#2.

点赞