gpt4 book ai didi

c - 使用 realloc() 时的错误

转载 作者:行者123 更新时间:2023-12-04 06:18:36 25 4
gpt4 key购买 nike

我正在使用 realloc()动态调整一些数组的大小。因为我写了很多这样的代码:

void *tmp;
if( (tmp = realloc(myobject, sizeof(object) * newsize) != NULL)
myobject = tmp

我想我会通过做这样的事情来缩短我的代码(愚蠢的想法):
void GetSpace(void *ptr, size_t size_of_object, int newsize){
void *tmp = NULL;
if ((tmp = realloc(ptr, size_of_object * newsize) == NULL)
//print error msg and exit
else
ptr = tmp;
}
int main(){
//This is an example
double *mydata1 = (double *)malloc (sizeof double * 5);


//later request more space for mydata1
GetSpace( mydata1, sizeof(double), 50);

}

这很愚蠢,因为它没有节省那么多行或使代码更具可读性,但我想知道为什么它不能按我期望的方式工作。当我使用 GetSpace()仅对于单个对象,它可以正常工作。如果我在没有初始化任何我调用函数的对象的情况下运行代码,它运行良好,但是当我调用 GetSpace() 时对于一个对象,然后将数据放入其中,然后调用 GetSpace()对于另一个对象,我得到一个堆栈跟踪,其中包含这样的消息
*** glibc detected *** ./a.out: realloc(): invalid old size: 0x00007fff05d96790 ***
0x00007fff05d96790是调整大小之前的第二个数组/对象的地址。为什么会这样?

最佳答案

在您的 GetSpace函数,您正在分配一个更大的新内存块,并将地址分配给局部变量 ptr .但是当函数退出时,这个新地址就丢失了。您的主程序仍然具有 ptr 的旧值,它现在指向无效(已释放)的内存。

您需要将新地址返回给调用者。试试这个。注意参数ptr现在是通过引用传递的,所以调用者的变量被更新了。

void GetSpace(void **ptr, size_t size_of_object, int newsize){
void *tmp = NULL;
if ((tmp = realloc(*ptr, size_of_object * newsize) == NULL)
//print error msg and exit
else
*ptr = tmp;
}

编辑:正如评论中指出的那样,这仍然不理想,因为您必须进行困惑的转换才能将指针的地址作为 void** 传递.一个改进是单独返回新指针,如下所示:
void *GetSpace(void *ptr, size_t size_of_object, int newsize){
void *tmp = NULL;
if ((tmp = realloc(ptr, size_of_object * newsize) == NULL)
//print error msg and exit
else
return tmp;
}

int main(){

...

//later request more space for mydata1
mydata1 = GetSpace( mydata1, sizeof(double), 50);
}

关于c - 使用 realloc() 时的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6901150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com