C语言传递二维数组到函数编译时出现不兼容指针类型报错问题
报错原因
你代码中定义的二维数组double A[rows][cols]属于变长数组(VLA),数组名A在作为函数参数传递时,会自动退化为指向其首元素的指针:
- 二维数组的首元素是长度为
cols的double类型一维数组,因此A退化后的类型为double (*)[cols](指向包含cols个double元素的数组的指针) - 但你声明的
print_array函数第三个参数要求的是double *类型(指向单个double元素的指针),二者类型不兼容,因此触发了编译警告。
解决方案
提供两种常用修改方式,任选其一即可:
方案1:修改print_array函数的参数类型,适配二维变长数组
由于变长数组的维度参数需要在数组声明前定义,只需要调整函数声明和定义的参数类型即可:
- 函数声明修改为:
void print_array(int rows, int cols, double A[rows][cols]);
- 函数实现同步修改,内部可以直接用二维数组的方式访问元素:
void print_array(int rows, int cols, double A[rows][cols]){ printf("\n"); int m,n; for (m=0;m<rows;m++){ for (n=0;n<cols;n++){ printf("A[%d,%d]=%f\n",m,n,A[m][n]); } } }
调用方式不需要修改,直接传A即可。
方案2:调用时传递首元素地址,适配现有print_array实现
不需要修改print_array的代码,只需要在调用时传递二维数组第一个元素的地址,拿到double *类型的指针:
把原来的调用代码
print_array(rows, cols, A);
修改为:
print_array(rows, cols, &A[0][0]);
或者等价写法:
print_array(rows, cols, (double *)A);
额外优化建议
你当前的代码生成的随机矩阵每次运行结果都是一样的,因为没有初始化随机数种子,可以在main函数开头调用srand((unsigned int)time(NULL));,并引入<time.h>头文件,实现每次运行生成不同的随机矩阵。
内容的提问来源于stack exchange,提问作者James Shill
相关产品推荐
相关产品推荐

