假设您有以下初始化多维数组的 ANSI C 代码:
int main()
{
int i, m = 5, n = 20;
int **a = malloc(m * sizeof(int *));
//Initialize the arrays
for (i = 0; i < m; i++) {
a[i]=malloc(n * sizeof(int));
}
//...do something with arrays
//How do I free the **a ?
return 0;
}
使用**a
后,如何正确释放内存?
[更新](解决方案)
感谢蒂姆(和其他人)answer ,我现在可以执行这样的函数来释放我的多维数组中的内存:
void freeArray(int **a, int m) {
int i;
for (i = 0; i < m; ++i) {
free(a[i]);
}
free(a);
}
最佳答案
好吧,有很多混淆解释到底是什么顺序
必须进行必要的 free()
调用,所以我会尝试阐明什么
人们正试图了解原因。
从基础开始,释放已分配的内存
使用 malloc()
,您只需使用指针调用 free()
malloc()
给你的。所以对于这段代码:
int **a = malloc(m * sizeof(int *));
你需要一个匹配:
free(a);
对于这一行:
a[i]=malloc(n * sizeof(int));
你需要一个匹配:
free(a[i]);
在一个类似的循环中。
这变得复杂的地方是这需要发生的顺序。如果
你多次调用 malloc()
来获得几个不同的 block
内存,一般来说,调用 free()
的顺序并不重要
你已经完成了他们。但是,这里的顺序很重要
具体原因:您正在使用一 block malloc
ed 内存来保存
指向其他 malloc
ed 内存块的指针。因为你必须
在你用
free()
,这意味着您将不得不释放 block
它们的指针存储在 a[i]
之前 你释放 a
block 本身。
带有存储在 a[i]
中的指针的各个 block 不依赖于每个 block
其他,因此可以按您喜欢的任何顺序免费
d。
所以,将所有这些放在一起,我们得到:
for (i = 0; i < m; i++) {
free(a[i]);
}
free(a);
最后一个提示:调用 malloc()
时,考虑更改这些:
int **a = malloc(m * sizeof(int *));
a[i]=malloc(n * sizeof(int));
到:
int **a = malloc(m * sizeof(*a));
a[i]=malloc(n * sizeof(*(a[i])));
这是在做什么?编译器知道 a
是一个 int **
,所以它可以
确定 sizeof(*a)
与 sizeof(int *)
相同。然而,如果
后来你改变主意,想要 char
或 short
或 long
或
数组中的任何内容而不是 int
,或者您稍后修改此代码
用在别的东西上,你只需要改变剩下的那个
在上面引用的第一行中引用 int
,以及其他所有内容
会自动为您就位。这消除了可能性
future 未注意到的错误。
祝你好运!
关于C:正确释放多维数组的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1733881/