当realloc移动内存块时如何更新其他指针?

zaj*_*cev 19 c memory malloc realloc

realloc引用说:

该功能可以将存储块移动到新位置,在这种情况下返回新位置.

这是否意味着如果我这样做:

void foo() {

        void* ptr = malloc( 1024 );

        unsigned char* cptr = ( unsigned char* )ptr+256;

        ptr = realloc( ptr, 4096 );
}
Run Code Online (Sandbox Code Playgroud)

那么如果realloc移动块,cptr可能会变为无效?

如果是,那么以任何方式重新分配信号,它将移动块,以便我可以做一些事情来防止cptr变得无效?

t0m*_*13b 7

是的,cptr因为realloc移动块会变得无效!不,没有提到要告诉你它正在移动内存块的信号.顺便说一下,你的代码看起来如果...继续阅读...请查看我对另一个问题的回答,并仔细阅读代码如何使用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.


R..*_*R.. 6

这来得有点晚了,但是这个问题的解决方案(没有人提到)不是使用指向需要分配的已分配块的指针。相反,使用距基指针的整数值偏移量或(更好)使用struct类型和成员元素来寻址已分配对象中的特定位置。

  • 希望我在写当前作业之前能完成这些。我还认为这是对zajcev OP的答案的一部分,解释了他可以做些什么。 (2认同)