ch3*_*055 2 c malloc pointers dynamic
我试图通过参数传递和返回一个二维动态数组,但是它总是显示我在问题中提到的这个警告。我知道数组参数有问题,但我在任何书籍或网站中都找不到如何正确传递维度发生变化的数组。我读过类似的关于警告的问题,主要是关于&在你的指针中添加一个,我没有在我的指针中添加。
#include <stdio.h>
#include <stdlib.h>
void fun(int m, int n, int (*arr)[n]);
int main(void) {
int i, j, m, n, **arr;
printf("Enter the dimensions m, n\n");
scanf("%d %d", &m, &n);
arr = (int **)malloc(m * sizeof(int *));
for (i = 0; i < m; i++) {
arr[i] = (int *)malloc(n * sizeof(int));
}
fun(m, n, *arr);
printf("\n\n");
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
printf("%5d", arr[i][j]);
}
printf("\n");
}
if (arr == NULL) {
exit(1);
} else
if (arr != NULL) {
free(arr);
}
return 0;
}
void fun(int m, int n, int (*arr)[n]) {
int i, j, k = 0;
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
k = k + 1;
arr[i][j] = k;
}
}
}
Run Code Online (Sandbox Code Playgroud)
int **arr;
Run Code Online (Sandbox Code Playgroud)
In main,arr是一个指向整数指针的指针,您使用嵌套内存分配填充它,因为涉及两个级别的指针。所述arr[i]可以被分段,并且每个可容纳不同数目的条目,使得arr一个“参差不齐”阵列。
int (*arr)[n]
Run Code Online (Sandbox Code Playgroud)
函数的参数是一个指向n整数数组的指针。这里的条目arr在内存中是连续的,因此arr[0]和arr[1]是sizeof(int[n])字节分开的。
这些是不同的类型,编译器会告诉你。选一个。
A您可以坚持使用指针到指针的方法。然后您的函数签名必须与中的定义匹配main:
void fun(int m, int n, int **arr) ...
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您还必须free全部arr[i]放在最后,在free(arr).
B或者,您可以保留当前函数并使用单个分配创建一个连续数组:
int (*arr)[n] = malloc(m * sizeof(*arr));
Run Code Online (Sandbox Code Playgroud)
然后将其直接传递给您的函数,而无需取消引用它:
fun(m, n, arr);
Run Code Online (Sandbox Code Playgroud)
最后,只是free(arr)。