这是一个用于在动态数组上重新分配一些内存的函数。我将typedef' d struct lottery
改为lot
。我通过引用传递结构数组(a
)和我希望它具有的新大小(n
)。我正在声明一个临时数组(b
),因此我可以重新分配到a
。
我的问题是:我正在使用b = realloc()
等在堆上创建一些字节,但是如果我在退出函数之前free(b)
它没有正常工作。如果我再次调用它b == NULL
变为true
,但如果我删除free(b)
它就可以了,但我认为这不对,因为我在堆上留下了垃圾字节。有人可以向我解释这个问题吗?
lot *Enterd(lot **a, int n) {
lot *b = NULL;
b = (lot *)realloc(*a, n * sizeof(lot));
if (b == NULL) {
printf("Memory could not be allocated for the new input.\n");
return NULL;
}
*a = b;
free(b);
return *a;
}
答案 0 :(得分:1)
b = realloc(*a, X)
释放与*a
相关联的内存,并分配一个大小为X
的新分配,存储在b
中。
现在当您*a = b
时,*a
和b
都会引用此新分配。
free(b)
之后,该分配将被释放,b
和*a
都会成为无效指针。那时return *a
有未定义的行为。
如果你没有免费b
,一切都很好。你不会泄漏内存,因为你仍然有一个指针:通过*a
(它引用调用者中的一个变量)和函数的返回值。
(另外,不要施放realloc()
。)