我相信这不应该工作,但它确实是
问题描述:
这是一个函数用于重新分配动态数组上的一些内存。我输入了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;
}
答
b = realloc(*a, X)
释放与*a
相关联的存储器,并分配大小X
的新的分配时,存储在b
。
现在,当您执行*a = b
时,*a
和b
都会引用此新分配。
free(b)
之后,该分配被释放,并且b
和*a
都成为无效指针。此时return *a
有未定义的行为。
如果你没有免费b
,一切都很好。你不会泄漏内存,因为你仍然有指向它的指针:通过*a
(它引用调用者中的一个变量)和函数的返回值。
(另外,不要投realloc()
)
谢谢汤姆·齐奇和melpomene.Why不应该我投它?在UNI我们了解到,realloc的返回一个void *,我们要抛弃它。 (?) – Edward
@爱德华不,'malloc'和'realloc'返回一个'void *',所以你*不必*施放它。一个'void *'指针可以隐式转换为任何对象指针类型。另一方面,铸造可以隐藏问题:http://c-faq.com/malloc/mallocnocast.html – melpomene
我会问我的proffesor,但感谢您的反馈和帮助! – Edward