realloc参考说:
该功能可以移动内存块 到一个新的位置,在这种情况下 返回新位置。
如果我这样做是否意味着:
void foo() {
void* ptr = malloc( 1024 );
unsigned char* cptr = ( unsigned char* )ptr+256;
ptr = realloc( ptr, 4096 );
}
如果realloc移动块,cptr可能会变为无效?
如果是,那么以任何方式重新分配信号,它会移动块,以便我可以做些什么来阻止cptr变得无效?
答案 0 :(得分:7)
是的,cptr
将变为无效,因为realloc会移动块!不,没有提到要告诉你它正在移动内存块的信号。顺便说一句,您的代码看起来不确定...请继续阅读...请查看我的answer其他问题并仔细阅读代码,了解它如何使用realloc
。普遍的共识是,如果你这样做:
void *ptr = malloc(1024); /* later on in the code */ ptr = realloc(ptr, 4096); /* BAM! if realloc failed, your precious memory is stuffed! */
解决这个问题的方法是使用临时指针并使用它,如下所示:
void *ptr = malloc(1024); /* later on in the code */ void *tmp = realloc(ptr, 4096); if (tmp != null) ptr = tmp;
编辑:感谢 安全 指出我之前输入此内容时悄悄进入的gremlin。
答案 1 :(得分:4)
是的,如果realloc移动块,cptr
将无效。
不,没有信号。您必须检查原始ptr
位置的返回值。
答案 2 :(得分:4)
这有点晚了,但是这个问题的解决方案(没有人提到过)不是将指针用于需要分配的已分配块。而是使用来自基指针的整数值偏移量,或者(更好地)使用struct
类型和成员元素来处理分配对象中的特定位置。
答案 3 :(得分:3)
是
最好的办法是在重新分配之前和之后比较ptr,看看它是否已被移动。您不应该指定偏移值的指针,而应该存储偏移量,然后用它索引原始运算符。
即
而不是void* newPtr = ptr + 10;
*newPtr = something;
使用
int new = 10;
ptr[new] = something;
答案 4 :(得分:2)
是的,如果realloc移动块,则cptr变为无效。