传递要在 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
)。
好的,所以我需要在 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
)。