【发布时间】:2020-07-29 06:39:39
【问题描述】:
我试图通过参数传递和返回一个二维动态数组,但是它总是显示我在问题中提到的这个警告。我知道数组参数有问题,但我在任何书籍或网站中都找不到如何正确传递尺寸变化的数组。我读过关于警告的类似问题,主要是关于在指针中添加&,我没有在我的指针中添加。
#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;
}
}
}
【问题讨论】:
-
我看不到你用
gcc 7.4.0和命令gcc -Wall filename.c -o testfile提到的警告,所以可能提到编译器版本等可能会有所帮助;不过,gcc警告我,您传递的是*arr而不是arr:fun()显然想要 指向数组的指针,即int **- 这是你分配什么;但看起来你正在传递一个int * -
int (*arr)[n]声明指向n大小的数组的指针,您需要int **。 -
两个一般性建议:(a) 保持简单,并在需要时使用
int*、int**等。 (b) 使用数组时避免使用双指针;相反,分配平坦的内存块(除非它们 真的 大)并进行指针运算:p[i*n+j] = value风格;这可能会让你的生活更简单,代码更容易阅读 -
@ch3055:您可以通过单击分数下方的灰色复选标记来接受其中一个答案。