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

Passing a dynamically allocated matrix to be modified in a function in C

好的,所以我需要在 C 中动态分配一个矩阵,然后将其传递给函数进行修改(我希望我在函数内部所做的更改在 return 到 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) 的方式造成的。 正确的做法是什么?

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

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

也不要转换 malloc 的 return 值。

事实上,在这里传递 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 的 return 值,scanf 以了解对它们的调用是否成功。

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

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