You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言传递二维数组到函数编译时出现不兼容指针类型报错问题

报错原因

你代码中定义的二维数组double A[rows][cols]属于变长数组(VLA),数组名A在作为函数参数传递时,会自动退化为指向其首元素的指针:

  • 二维数组的首元素是长度为cols的double类型一维数组,因此A退化后的类型为double (*)[cols](指向包含cols个double元素的数组的指针)
  • 但你声明的print_array函数第三个参数要求的是double *类型(指向单个double元素的指针),二者类型不兼容,因此触发了编译警告。
解决方案

提供两种常用修改方式,任选其一即可:

方案1:修改print_array函数的参数类型,适配二维变长数组

由于变长数组的维度参数需要在数组声明前定义,只需要调整函数声明和定义的参数类型即可:

  1. 函数声明修改为:
void print_array(int rows, int cols, double A[rows][cols]);
  1. 函数实现同步修改,内部可以直接用二维数组的方式访问元素:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 03:21:00