当realloc缩小已分配的块时,内存是否空闲?

时间:2013-03-20 15:35:50

标签: c unix pointers posix realloc

我正在构建一个使用unsigned short的数组的bigInt数据类型。在某些函数中,可以使用或不使用最高阶短,但总是分配以防万一。为了防止从基本数学运算中消耗无限的内存,我想重新分配数组:

toReturn.numArray = realloc(toReturn.numArray, (sizeof(unsigned short)) * (toReturn.numElements - 1))

但我不知道最高位是自由(理想)还是最低位。

4 个答案:

答案 0 :(得分:3)

无法保证在缩小尺寸期间,相同的内存块将返回给您,并释放一些(缩小的)内存。你不应该依赖它,因为它根本不能保证。

C99标准7.20.3.4-1:重新分配功能:

  

realloc函数释放ptr指向的旧对象并返回一个   指向具有指定大小大小的新对象的指针。新内容   对象应与解除分配之前的旧对象相同,直到新旧尺寸中的较小者。新对象中超出旧对象大小的任何字节都具有不确定的值。

答案 1 :(得分:1)

如果重新定位内存块,数据将从旧缓冲区的底部复制到新大小。

如果您想保留数据的顶部,则必须执行malloc / memmove或类似操作。

这与你的位有什么关系取决于你如何将数据映射到块中,我想。这应该是可以控制的。

答案 2 :(得分:1)

来自'man realloc()'

 The realloc() function changes the size of the block pointed
 to by ptr to size bytes and returns a pointer to the (possi-
 bly moved) block. The contents will be unchanged up  to  the
 lesser  of  the  new  and  old sizes.

答案 3 :(得分:0)

好吧,我是个笨蛋。

array = realloc(array,smallerSizeNumber);

将数组[0]保存到数组[smallerSizeNumber - 1]。

高阶位丢失。