好吧,所以我需要在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)的方式引起的。什么是正确的方法呢?
你必须首先取消引用它,因为这样你就可以获得动态分配内存的双指针
(*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)
检查malloc
,scanf
的返回值,以了解对他们的调用是否成功。
完成后,释放动态分配的内存。
使用gcc -Wall -Werror progname.c
启用所有标志编译代码。(使用gcc
)。