我想知道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?
答案 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
:致电malloc
和memcpy
。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抓取一个堆,然后从该堆分配内存。因此操作系统不会知道单个内存分配,因此不会移动。