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

C语言中矩阵作为函数参数传递的类型错误及解决方法

问题描述

我尝试用以下C代码按给定公式生成矩阵,但没法把数组作为参数传入生成矩阵的函数,编译器报类型不兼容错误。我创建的是int数组,为啥提示把int数组作为int值传递是错误的?怎么正确把矩阵作为参数传入函数?

我的代码

#include <stdio.h>
#include <stdlib.h>

int imprimeMatriz (int*, int, int);
int main(){
    int m,n;
    printf("Entre com linhas e colunas da matriz");
    scanf("%d %d",&m,&n);
    int  matrix[m][n];
    imprimeMatriz(matrix,m,n);
     for (int i=0 ; i<n ; i++){
        for (int j=0; j<n;j++){
    printf("%d", &matrix[i][j]);
        }
    }
    return 0;
}

int imprimeMatriz(int p, int m, int n){

    for (int i=0 ; i<n ; i++){
        for (int j=0; j<n;j++){
    p = (5-i)*(j+1);
    }
        }

   return p;
}

编译错误信息

matrix.c: In function ‘main’:
matrix.c:10:19: warning: passing argument 1 of ‘imprimeMatriz’ from incompatible pointer type [-Wincompatible-pointer-types]
   10 |     imprimeMatriz(matrix,m,n);
      |                   ^~~~~~
      |                   |
      |                   int (*)[n]
matrix.c:4:20: note: expected ‘int *’ but argument is of type ‘int (*)[n]’
    4 | int imprimeMatriz (int*, int, int);
      |                    ^~~~
matrix.c: At top level:
matrix.c:19:5: error: conflicting types for ‘imprimeMatriz’; have ‘int(int,  int,  int)’
   19 | int imprimeMatriz(int p, int m, int n){
      |     ^~~~~~~~~~~~~
matrix.c:4:5: note: previous declaration of ‘imprimeMatriz’ with type ‘int(int *, int,  int)’
    4 | int imprimeMatriz (int*, int, int);
      |     ^~~~~~~~~~~~~
问题分析与解决

错误原因拆解

  1. 函数声明与定义不匹配:声明里第一个参数是int*,但定义里写成了int p(单个int变量),直接触发类型冲突错误,这是最核心的语法错误。
  2. 二维数组传参类型不匹配:你定义的是变长二维数组int matrix[m][n],当它作为函数参数传递时,会退化为指向一维数组的指针int (*)[n],而不是int*,所以和声明的int*类型不兼容,报指针类型错误。
  3. 函数逻辑完全偏离需求:当前imprimeMatriz函数只是修改单个int变量p的值,根本没对传入的矩阵做任何赋值操作,完全达不到生成矩阵的目的。
  4. 主函数printf错误:printf("%d", &matrix[i][j]);里传的是元素的地址,应该直接传matrix[i][j],否则会输出内存地址而非矩阵元素值。

修正后的代码

#include <stdio.h>
#include <stdlib.h>

// 声明时使用变长数组参数,C99及以后支持
void geraMatriz(int p[][], int linhas, int colunas);

int main(){
    int m,n;
    printf("Entre com linhas e colunas da matriz: ");
    scanf("%d %d",&m,&n);
    int matrix[m][n];
    
    // 传入矩阵、行数、列数
    geraMatriz(matrix, m, n);
    
    // 打印矩阵,修正printf参数
    for (int i=0 ; i<m ; i++){
        for (int j=0; j<n;j++){
            printf("%d ", matrix[i][j]);
        }
        printf("\n"); // 每行结束换行,增强可读性
    }
    return 0;
}

// 定义时匹配声明,用变长数组操作矩阵
void geraMatriz(int p[][], int linhas, int colunas){
    for (int i=0 ; i<linhas ; i++){
        for (int j=0; j<colunas;j++){
            // 给矩阵的每个元素赋值
            p[i][j] = (5 - i) * (j + 1);
        }
    }
}

补充说明

  • 如果编译器不支持C99的变长数组,可以改用指针的指针动态分配内存,或者将矩阵扁平化处理(把二维数组当成一维数组传递,手动计算索引:index = i * colunas + j)。
  • 函数名改为geraMatriz(生成矩阵)更贴合功能,原函数名imprimeMatriz是打印矩阵的意思,和实际功能不符。

内容的提问来源于stack exchange,提问作者gbzz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:01:46