C:正确释放多维数组的内存

标签 c memory-management memory-leaks free malloc

假设您有以下初始化多维数组的 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 malloced 内存来保存 指向其他 malloced 内存块的指针。因为你必须 在你用 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 *) 相同。然而,如果 后来你改变主意,想要 charshortlong 或 数组中的任何内容而不是 int,或者您稍后修改此代码 用在别的东西上,你只需要改变剩下的那个 在上面引用的第一行中引用 int,以及其他所有内容 会自动为您就位。这消除了可能性 future 未注意到的错误。

祝你好运!

关于C:正确释放多维数组的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1733881/

相关文章:

C 程序 : How to read from one file and write into another? 索引

c - 如何使用 C 中的信号同步两个进程(子进程和父进程)?

c++ - 在 C++ 中释放指针两次或更多次时会发生什么?

c++ - 分配结构数组后内存被覆盖

c - 内存泄漏 - C

node.js - 为什么 Node.js heapdump 显示编译后的代码?

C- 'no match for operator++ in++month'

c++ - 我怎样才能克服cuda中的内存分配

ios UIViewController 不调用 viewDidUnload

c - C winapi中服务器的实现