我相信这不应该工作,但它确实是

问题描述:

这是一个函数用于重新分配动态数组上的一些内存。我输入了struct lotterylot。我通过引用传递结构数组(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时,*ab都会引用此新分配。

free(b)之后,该分配被释放,并且b*a都成为无效指针。此时return *a有未定义的行为。

如果你没有免费b,一切都很好。你不会泄漏内存,因为你仍然有指向它的指针:通过*a(它引用调用者中的一个变量)和函数的返回值。

(另外,不要投realloc()

+0

谢谢汤姆·齐奇和melpomene.Why不应该我投它?在UNI我们了解到,realloc的返回一个void *,我们要抛弃它。 (?) – Edward

+0

@爱德华不,'malloc'和'realloc'返回一个'void *',所以你*不必*施放它。一个'void *'指针可以隐式转换为任何对象指针类型。另一方面,铸造可以隐藏问题:http://c-faq.com/malloc/mallocnocast.html – melpomene

+0

我会问我的proffesor,但感谢您的反馈和帮助! – Edward