Я использую 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()
для другого объекта, я получаю стекtrace с таким сообщением
*** glibc detected *** ./a.out: realloc(): invalid old size: 0x00007fff05d96790 ***
0x00007fff05d96790
- это адрес второго массива / объекта до изменения размера.Почему это происходит?