main.c:警告:传递不兼容指针类型中""的参数



我试图通过参数传递并返回一个二维动态数组,但它总是显示我在问题中提到的警告。我知道数组参数有问题,但我在任何书或网站上都找不到如何正确传递维度发生变化的数组。我读过与我类似的关于警告的问题,主要是关于在你的指针中添加&,我在我的指针中没有添加。

#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定义为接收指向可变大小数组或nint的指针。这是一些C编译器可能不支持的C99特定语法。你也可以用一个更简单、更可读的原型来定义fun,它实际上是等价的:

void fun(int m, int n, int arr[m][n]);

也相当于这个:

void fun(int m, int n, int arr[][n]);

问题是您分配了一个非常不同类型的对象:一个m指针数组到nint数组。相反,您应该分配一个m可变大小的nint数组,并将其地址存储到适当类型的指针:

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;
}
}
}

最新更新