11

我想知道 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 ?

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

4

6 回答 6

17

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

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

不,不保证

于 2009-11-15T03:14:28.007 回答
7

不保证realloc会返回相同的位置,期间。

于 2009-11-15T03:16:32.010 回答
6

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

于 2009-11-15T03:13:40.343 回答
4

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

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

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

于 2010-09-22T05:03:23.313 回答
3

在我看来,所有当前的答案(在这个答案的时候)都没有提到任何标准文档。

对于 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 函数返回一个指向新对象的指针(它可能与指向旧对象的指针具有相同的值),如果无法分配新对象,则返回一个空指针。

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

于 2014-08-04T18:13:16.897 回答
0

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

于 2009-11-15T03:15:08.703 回答