我确定这不应该起作用,但确实有效
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
时,*a
和 b
都会引用此新分配。
在 free(b)
之后,该分配被释放并且 b
和 *a
都成为无效指针。那时 return *a
有未定义的行为。
如果你不释放 b
,一切都很好。你不会泄漏内存,因为你仍然有一个指向它的指针:通过 *a
(它引用调用者中的一个变量)和函数的 return 值。
(还有,不要投realloc()
。)
这是一个用于在动态数组上重新分配一些内存的函数。我已经将 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
时,*a
和 b
都会引用此新分配。
在 free(b)
之后,该分配被释放并且 b
和 *a
都成为无效指针。那时 return *a
有未定义的行为。
如果你不释放 b
,一切都很好。你不会泄漏内存,因为你仍然有一个指向它的指针:通过 *a
(它引用调用者中的一个变量)和函数的 return 值。
(还有,不要投realloc()
。)