当realloc移动内存块时如何更新其他指针?
realloc引用说:
该function可以将存储块移动到新位置,在这种情况下返回新位置。
这是否意味着如果我这样做:
void foo() { void* ptr = malloc( 1024 ); unsigned char* cptr = ( unsigned char* )ptr+256; ptr = realloc( ptr, 4096 ); }
如果realloc移动块,cptr可能会变为无效?
如果是,那么以任何方式重新分配信号,它将移动块,以便我可以做一些事情来防止cptr变得无效?
是的,当realloc移动块时, cptr
将变为无效! 不,没有提到要告诉你它正在移动内存块的信号。 顺便说一句,你的代码看起来如果……阅读…请查看我对另一个问题的回答 ,并仔细阅读代码如何使用realloc
。 普遍的共识是,如果你这样做:
void * ptr = malloc(1024); / *稍后在代码中* / ptr = realloc(ptr,4096); / * BAM! 如果realloc失败了,你的宝贵记忆就会被塞满! * /
解决这个问题的方法是使用临时指针并使用如下所示:
void * ptr = malloc(1024); / *稍后在代码中* / void * tmp = realloc(ptr,4096); if(tmp!= null)ptr = tmp;
编辑:谢谢安全指出我早些时候打字时悄悄进入的gremlin。
是的,如果realloc移动块,则cptr
将变为无效。
不,没有信号。 您必须检查原始ptr
位置的返回值。
这有点晚了,但是这个问题的解决方案(没有人提到过)不是将指针用于需要分配的已分配块。 相反,使用来自基指针的整数值偏移量或(更好地)使用struct
类型和成员元素来寻址已分配对象中的特定位置。
是。
最好的办法是在重新分配之前和之后比较ptr,看看它是否已被移动。 您不应该指定偏移值的指针,而是应该存储偏移量,然后使用它索引原始运算符。
即
而不是void* newPtr = ptr + 10; *newPtr = something;
void* newPtr = ptr + 10; *newPtr = something;
使用int new = 10; ptr[new] = something;
int new = 10; ptr[new] = something;
是的,如果realloc移动块,则cptr变为无效。