我确定这不应该起作用,但确实有效

I'm sure this is not supposed to work but it does

这是一个用于在动态数组上重新分配一些内存的函数。我已经将 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 时,*ab 都会引用此新分配。

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

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

(还有,不要投realloc()。)