我确信这不应该有用,但确实如此

时间:2017-01-22 16:01:02

标签: c memory dynamic free realloc

这是一个用于在动态数组上重新分配一些内存的函数。我将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;
}

1 个答案:

答案 0 :(得分:1)

b = realloc(*a, X)释放与*a相关联的内存,并分配一个大小为X的新分配,存储在b中。

现在当您*a = b时,*ab都会引用此新分配。

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

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

(另外,不要施放realloc()。)