当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变为无效。