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

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

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 ? 

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

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

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

不,不保证

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

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

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

  • malloc :打电话给sbrk
  • realloc :调用mallocmemcpy
  • free :无操作。

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

在我看来,所有当前答案(在本答复时)都没有提到任何标准文件。

对于C ++,我将参考工作草案,编程语言C ++标准 ,文档编号:N3337,日期:2012-01-16,修订:N3291 ,根据https://isocpp.org/std/the-standard ,是与非免费官方C ++ 11标准文档最接近的免费文档; 在这里我们找到20.6.13 C库

2内容与标准C库标题相同,但有以下更改:[在我看来,列出的更改与问题无关]。

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

根据https://stackoverflow.com/a/83763/15485 ,最接近非免费官方C11标准文件的免费文件是编程语言 – C ,N1570委员会草案 – 2011年4月12日ISO / IEC 9899:201x ; 这里我们在7.22.3.5找到realloc函数

4 realloc函数返回指向新对象的指针( 可能与指向旧对象的指针具有相同的值 ),如果无法分配新对象,则返回空指针。

我不是母语为英语的人,所以由您来解释“可能有”的含义。

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