【问题标题】:I'm sure this is not supposed to work but it does我确定这不应该工作,但它确实
【发布时间】:2017-06-07 04:18:00
【问题描述】:

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

【问题讨论】:

    标签: c memory dynamic free realloc


    【解决方案1】:

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

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

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

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

    (另外,不要投射realloc()。)

    【讨论】:

    • 谢谢 Tom Zych 和 melpomene。为什么我不应该转换它?在 uni 中,我们了解到 realloc 返回一个 void*,我们应该转换它。 (?)
    • @Edward 不,mallocrealloc 返回一个 void *,因此您不必 强制转换它。 void * 指针可以隐式转换为任何对象指针类型。另一方面,强制转换可以隐藏问题:c-faq.com/malloc/mallocnocast.html
    • 我会问我的教授,但无论如何感谢您的反馈和帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    相关资源
    最近更新 更多