【问题标题】:Freeing a 2-D array in C在 C 中释放二维数组
【发布时间】:2014-04-28 13:56:27
【问题描述】:

请多多包涵,因为这可能是一个非常简单的问题,但我对 C 语言很陌生。 我正在尝试 malloc 一个特定的数组,然后释放它。但是,该行:

    M = malloc(N*sizeof(double *));

...不起作用。有人可以向我解释为什么这不起作用以及解决方案是什么?非常感谢。

【问题讨论】:

  • 昨天我加了:C: Freeing 2D array阅读。
  • 另外,don't cast malloc.
  • @JohnnyMopp 没有强制转换是行不通的。我已经编辑了上面的代码,以反映我认为没有强制转换的情况。但是,M = malloc(N*sizeof(double *)) 行返回错误
  • 那么您可能正在编译为 C++。在 C++ 中,你需要演员表。
  • @JohnnyMopp 它编译得很好,它只是在那个 = 符号下面有一条弯曲的红线。我不明白为什么,但不要担心。感谢您提供有关选角的信息 - 今天之前我不知道。

标签: c malloc free multidimensional-array


【解决方案1】:

您应该释放所有位置,而不仅仅是第一个位置。见this我写的例子。

正如@Grijesh 所述,分配也是错误的。该示例也涵盖了分配。此外,我建议您不要将 malloc 的返回 (more)。

您必须将二维数组视为一维数组,其中每个单元格都是指向一维数组的指针。图片可能会有所帮助: http://gsamaras.files.wordpress.com/2014/04/array2d-n.png 在这里,保存指针的一维数组在左边,它的每个单元都指向另一个一维数组。 左边有多少个一维数组?与左侧数组中的单元格一样多。

顺便说一句,耐莉,我认为这不是一个愚蠢的问题,它会让初学者陷入困境。 ;)

编辑: 关于您的新代码,您必须对 matrix_free 有相同的定义和声明,并且按照您应该的方式调用它。什么是定义等?? Answer.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

#define Nmax 9000

double **makeMatrix(int N);
void free_matrix(double **M,int N);

int main(void) {
    int N;

    for (N = 2; N < Nmax; N *= 2) {
        double **L = makeMatrix(N);
        printf("yes \n");
        free_matrix(L, N);
        printf("woo \n");
    }
    return 0;
}

double **makeMatrix(int N) {
    int i, j;
    double **M;

    M = malloc(N * sizeof(double *));
    for (i = 0; i < N; i++)
        M[i] = malloc(N * sizeof(double));

    for (i = 1; i < N; i++) {
        for (j = 1; j < N; j++) {
            M[i][j] = (i) * (j) * M_PI / N;
        }
    }

    return (M);
}

void free_matrix(double **M, int N) {
    int i;
    for (i = 1; i <= N; i++) {
        free(M[i]);
    }
    free(M);
}

然后我收到youwho输出。 :) 但是,它会在某个点停止,因为 NMAX 太大了!不仅 NMAX 太大,而且 N 增长得非常快(N *=)。你在一张纸上做过数学吗?数字太大。例如,如果我做N +=,那么,我可以一直到NMAX = 9000调试提示: 我怎么知道它到达哪个循环? 我打印出循环的计数器,像这样

printf("woo %d\n",N);

当然,如果你对自己有把握,那么我建议你学习调试器。

【讨论】:

  • 是的。顺便说一句,该示例也涵盖了分配。我回答了耐莉的回答。更好的问题会得到更好的答案。
  • @G.Samaras 感谢您的回复。我还是有点困惑。我以这种方式分配但它不起作用:'double *M;' 'M = malloc(Nsizeof(double ));' 'for(i = 0 ; i sizeof(double) );'
  • @GrijeshChauhan 感谢您的链接。你能看看我上面的评论吗?谢谢。
  • 究竟出了什么问题?也许你可以用新代码编辑你的原始代码。:)
  • @NellyDee 您在评论中的分配步骤看起来是正确的,我对在初始化矩阵的分配循环之后的嵌套循环有疑问,请注意您不要使用 M[0][col]M[row][col] 作为你从i = 1for(i=1;i&lt;N;i++){开始
猜你喜欢
  • 2011-08-05
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 2018-09-01
  • 1970-01-01
  • 2012-10-08
相关资源
最近更新 更多