我正在使用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
是调整大小之前的第二个数组/对象的地址。为什么会这样?