19

realloc 参考说:

该函数可以将内存块移动到新位置,在这种情况下,将返回新位置。

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

void foo() {

        void* ptr = malloc( 1024 );

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

        ptr = realloc( ptr, 4096 );
}

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

如果是,那么 realloc 是否以任何方式发出信号,它会移动块,以便我可以做一些事情来防止 cptr 变得无效?

4

5 回答 5

8

是的,cptr将随着 realloc 移动块而变得无效!不,没有提到向您发出信号告诉您它正在移动内存块。顺便说一句,您的代码看起来很可疑...请继续阅读...请查看我对另一个问题的回答,并非常仔细地阅读代码以了解其使用方式realloc。一般的共识是,如果你这样做:

无效 *ptr = malloc(1024);

/* 稍后在代码中 */

ptr = realloc(ptr, 4096);

/* 砰!如果 realloc 失败,你的宝贵内存就被塞满了!*/

解决这个问题的方法是使用临时指针并使用它,如下所示:

无效 *ptr = malloc(1024);

/* 稍后在代码中 */

无效 *tmp = realloc(ptr, 4096);

如果 (tmp != null) ptr = tmp;

编辑:感谢Secure指出我之前输入此内容时出现的一个小鬼。

于 2010-01-31T15:15:00.127 回答
5

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

于 2010-10-05T04:06:35.770 回答
4

是的,cptr如果 realloc 移动块将变为无效。

不,没有信号。您必须根据原始ptr位置检查返回值。

于 2010-01-31T15:07:08.467 回答
3

是的。

最好的办法是比较重新分配前后的ptr,看看它是否被移动了。您不应该分配指向偏移值的指针,而是应该存储偏移量,然后用它索引原始运算符。

IE

代替 void* newPtr = ptr + 10; *newPtr = something;

采用 int new = 10; ptr[new] = something;

于 2010-01-31T15:06:15.427 回答
2

是的,如果 realloc 移动了块,cptr 就会失效。

于 2010-01-31T15:07:00.793 回答