传递动态分配的矩阵以在C中的函数中进行修改

时间:2017-12-30 20:22:33

标签: c matrix allocation

Okey,所以我需要在C中动态分配一个矩阵,然后将其传递给一个函数进行修改(我希望在返回main之后我在函数内部进行的更改)。这就是我所做的:

void read_zone (int *(**m), int N, int M) {
    int x, i, j;
    for (i = 0; i < N; i++) {
        for (j = 0; j < M; j++) {
            scanf("%d", &x);
            m[i][j] = x;
        }
    }

然后在main()里面我有:

int **m;
int N = 2, M = 3;

m = (int **) malloc(N * sizeof(int *));

for (i = 0; i < N; i++) {
    m[i] = (int *) malloc(M * sizeof(int));
}
read_zone(&m, N, M);

所以问题是,当它进入函数时,似乎没有分配m [0] [2](即使m [0] [0]和m [0] [1]是),但是在主要我可以访问它,所以它肯定是由我传递给函数(&amp; m)的方式引起的。 做正确的方法是什么?

1 个答案:

答案 0 :(得分:2)

你必须首先取消引用它,因为这样你就得到了你动态分配内存的双指针

malloc

也不要转换m的返回值。

事实上,在这里传递read_zone(m, N, M); 的地址首先是冗余。你可以简单地做到这一点

void read_zone (int **m, int N, int M) {
   ..
       scanf("%d", &x);
       m[i][j] = x;
   ..
}

并且

void read_zone (int ***m, int N, int M) (The way you did)

事情在这里传递变量的地址不会为你服务任何目的。您没有更改双指针的值。

如果您编译了代码 - 您将看到编译器抱怨类型不匹配。函数签名将是

malloc

检查scanfgcc -Wall -Werror progname.c的返回值,以了解对他们的调用是否成功。

使用完毕后释放动态分配的内存。

编译启用了所有标志的代码gcc。(使用{{1}})。