gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:28:04 26 4
gpt4 key购买 nike

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

关于c - 传递要在 C 函数中修改的动态分配矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48037580/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com