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