如果新的尺寸更小,可以realloc移动指针吗?

时间:2009-11-15 03:11:03

标签: c realloc

我想知道C或C ++标准是否保证在使用较小(非零)大小调用realloc时不会更改指针:

size_t n=1000;
T*ptr=(T*)malloc(n*sizeof(T));
//<--do something useful (that won't touch/reallocate ptr of course)
size_t n2=100;//or any value in [1,n-1]
T*ptr2=(T*)realloc(ptr,n2*sizeof(T));
//<-- are we guaranteed that ptr2==ptr ?

基本上,操作系统可以自行决定,因为我们释放了大量内存块,他想利用所有realloc来对内存进行碎片整理,并以某种方式移动ptr2?

6 个答案:

答案 0 :(得分:17)

http://opengroup.org/onlinepubs/007908775/xsh/realloc.html

  

成功完成后,大小不等于0,realloc()返回指向(可能已移动)分配空间的指针。

不,不保证

答案 1 :(得分:7)

无法保证realloc将返回相同的位置,周期。

答案 2 :(得分:6)

使用realloc,你绝对无法保证记忆在后面的位置。我相信libc的默认malloc只会勉强复制内存,所以实际上你可能没问题。但不要指望它。

答案 3 :(得分:4)

realloc不需要将块保留在适当的位置,实际上最简单的存根实现是一个不可能的例子:

  • malloc:致电sbrk
  • realloc:致电mallocmemcpy
  • free:no-op。

这可能听起来很荒谬,但有时对于嵌入式系统而言,我刚刚描述的实现实际上是最佳实现。

答案 4 :(得分:2)

在我看来,所有当前的答案(在本答复时)并未涉及任何标准文件。

对于C ++,我将参考Working Draft, Standard for Programming Language C++, Document Number: N3337, Date: 2012-01-16, Revises: N3291,根据https://isocpp.org/std/the-standard,它是最接近非自由官方C ++ 11标准文档的免费文档;在这里我们找到 20.6.13 C库

  

2内容与标准C库头相同,   有以下变化:[在我看来,列出的变化与之无关   问题。

所以现在我们必须参考C标准。

根据https://stackoverflow.com/a/83763/15485,与非免费官方C11标准文件最接近的免费文件是Programming languages — C, N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x;在这里我们找到 7.22.3.5 realloc函数

  

4 realloc函数返回一个指向新对象的指针(哪个   可能与指向旧对象的指针具有相同的值,或者为null   指针如果无法分配新对象。

我不是英语母语人士,因此您可以解释“可能有”的含义。

答案 5 :(得分:0)

在Windows上,C-Runtime抓取一个堆,然后从该堆分配内存。因此操作系统不会知道单个内存分配,因此不会移动。