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

问题描述 投票:1回答:1

好吧,所以我需要在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]是),但在main中我可以访问它,这肯定是由我传递给函数(&m)的方式引起的。什么是正确的方法呢?

c matrix allocation
1个回答
2
投票

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

(*m)[i][j] = x;

也不要强制转换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)

检查mallocscanf的返回值,以了解对他们的调用是否成功。

完成后,释放动态分配的内存。

使用gcc -Wall -Werror progname.c启用所有标志编译代码。(使用gcc)。

© www.soinside.com 2019 - 2024. All rights reserved.