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); | ^~~~~~~~~~~~~
问题分析与解决
错误原因拆解
- 函数声明与定义不匹配:声明里第一个参数是
int*,但定义里写成了int p(单个int变量),直接触发类型冲突错误,这是最核心的语法错误。 - 二维数组传参类型不匹配:你定义的是变长二维数组
int matrix[m][n],当它作为函数参数传递时,会退化为指向一维数组的指针int (*)[n],而不是int*,所以和声明的int*类型不兼容,报指针类型错误。 - 函数逻辑完全偏离需求:当前
imprimeMatriz函数只是修改单个int变量p的值,根本没对传入的矩阵做任何赋值操作,完全达不到生成矩阵的目的。 - 主函数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
相关产品推荐
相关产品推荐

