我试图通过参数传递并返回一个二维动态数组,但它总是显示我在问题中提到的警告。我知道数组参数有问题,但我在任何书或网站上都找不到如何正确传递维度发生变化的数组。我读过与我类似的关于警告的问题,主要是关于在你的指针中添加&
,我在我的指针中没有添加。
#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, nn");
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("nn");
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;
}
}
}
int **arr;
在main
中,arr
是指向整数指针的指针,您可以用嵌套内存分配来填充它,因为涉及两个级别的指针。arr[i]
可以是分段的,每个可以包含不同数量的条目,从而使arr
成为一个"不规则"的数组。
int (*arr)[n]
函数的参数是指向n
整数数组的指针。这里,arr
的条目在存储器中是连续的,因此arr[0]
和arr[1]
相隔sizeof(int[n])
个字节。
这是不同的类型,编译器告诉你是这样的。选择一个。
A您可以坚持指针对指针的方法。那么您的函数签名必须与main
:中的定义相匹配
void fun(int m, int n, int **arr) ...
在这种情况下,您还必须在free(arr)
之前的末尾free
所有arr[i]
。
B或者,您可以保留curret函数,并使用单个分配创建一个连续数组:
int (*arr)[n] = malloc(m * sizeof(*arr));
然后将其直接传递给您的函数,而不取消引用:
fun(m, n, arr);
最后,只有free(arr)
。
您正在传递指向int(即*arr(的指针,但您已经声明了一个函数,该函数将获得指向n
整数数组的指针。
因此,只需进行以下更改:
void fun(int m, int n, int **arr); // also change where function definition begins
fun(m, n, arr);
顺便说一句,释放内存是不完整的。
for (i=0; i<m; i++)
free(arr[i]); // first free individual array elements
free(arr);
fun
定义为接收指向可变大小数组或n
int
的指针。这是一些C编译器可能不支持的C99特定语法。你也可以用一个更简单、更可读的原型来定义fun
,它实际上是等价的:
void fun(int m, int n, int arr[m][n]);
也相当于这个:
void fun(int m, int n, int arr[][n]);
问题是您分配了一个非常不同类型的对象:一个m
指针数组到n
int
数组。相反,您应该分配一个m
可变大小的n
int
数组,并将其地址存储到适当类型的指针:
int (*arr)[n] = malloc(m * sizeof(*arr));
或者将其定义为具有自动存储功能的2D可变大小阵列:
int arr[m][n];
如果使用malloc()
进行分配,则可以使用释放对象
free(arr);
这是一个修改版本:
#include <stdio.h>
#include <stdlib.h>
void fun(int m, int n, int arr[m][n]);
int main(void) {
int i, j, m, n;
printf("Enter the dimensions m, nn");
if (scanf("%d %d", &m, &n) != 2 || m <= 0 || n <= 0)
return 1;
int (*arr)[n] = malloc(m * sizeof(*arr));
if (arr == NULL)
return 1;
fun(m, n, arr);
printf("nn");
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
printf("%5d", arr[i][j]);
}
printf("n");
}
free(arr);
return 0;
}
void fun(int m, int n, int arr[m][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;
}
}
}