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

时间:2010-01-31 15:04:03

标签: c memory malloc realloc

realloc参考说:

  

该功能可以移动内存块   到一个新的位置,在这种情况下   返回新位置。

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

void foo() {

        void* ptr = malloc( 1024 );

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

        ptr = realloc( ptr, 4096 );
}

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

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

5 个答案:

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