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)的方式引起的。 做正确的方法是什么?
答案 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
检查scanf
,gcc -Wall -Werror progname.c
的返回值,以了解对他们的调用是否成功。
使用完毕后释放动态分配的内存。
编译启用了所有标志的代码gcc
。(使用{{1}})。