gpt4 book ai didi

c - 我确信这不应该起作用,但它确实起作用

转载 作者:行者123 更新时间:2023-11-30 15:00:59 26 4
gpt4 key购买 nike

这是一个用于在动态数组上重新分配一些内存的函数。我已将 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 (引用调用者中的变量)和函数的返回值。

(另外,不要强制转换 realloc()。)

关于c - 我确信这不应该起作用,但它确实起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41793073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com