有时候我们需要先读取用户的输入来定义一个二维数组的规模,但是经常会出现各式各样的问题,尤其是当代码涉及到在函数间传递数组的时候.下面就写两种比较安全妥当的方法.
方法一:
通过创建一个二级指针来实现二维数组的传递.
优点:易于理解,而且在函数间传递起来较为方便.
缺点:创建和释放比较麻烦.
#include <stdio.h>
#include <stdlib.h>
void f(int **a)
{
printf("f(int **a) is right.\n");
}
int main()
{
int height = 0, width = 0;
printf("height width: ");
scanf("%d%d", &height, &width);
int **a = (int **)malloc(sizeof(int *) * height);
for (int i = 0; i < height; i++)
a[i] = (int *)malloc(sizeof(int) * width);
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
a[i][j] = 0;
printf("%d ", a[i][j]);
}
puts("");
}
f(a);
for (int i = 0; i < height; i++)
free(a[i]);
free(a);
}
方法二:
通过创建一个数组指针来实现二维数组的传递.
优点:创建和释放较为简单.
缺点:在函数间传递时比较麻烦,必须要加上宽度作为参数
#include <stdio.h>
#include <stdlib.h>
void f(int width, int (*a)[width])
{
printf("f(int width, int (*a)[width]) is right.\n");
}
int main()
{
int height = 0, width = 0;
printf("height width: ");
scanf("%d%d", &height, &width);
int(*a)[width] = (int(*)[width])malloc(sizeof(int) * height * width);
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
a[i][j] = 1;
printf("%d ", a[i][j]);
}
puts("");
}
f(width, a);
free(a);
}
错误示范:
#include <stdio.h>
int main()
{
int height = 0, width = 0;
scanf("%d%d",&height,width);
int a[height][width];
}
通过以上代码创建二维数组看似可行,实则不然,因为创建的数组其实根本就不是二维数组,如图,显示
a: [0]
,而非我们想要的a: int[3][3]
.