C语言矩阵输入异常及变长数组函数参数未声明报错求助
C语言矩阵输入问题解决方案
问题1:第二个矩阵要求输入元素数多于预期的原因
你定义的matrixInput和matrixDisplay函数中,矩阵形参写为int matrix[][10],这代表强制约定矩阵的第二维长度固定为10。但你在main函数中创建的是变长数组(VLA)matrix1[row][column],当你输入列数为3时,实际每一行只有3个元素,和函数约定的10个元素不匹配。
函数寻址矩阵元素时,会按照首地址 + i * 10 + j计算位置,和你实际矩阵的内存布局完全错位,就会出现第一个矩阵输入正常,第二个矩阵输入数量异常、甚至后续输出错乱的问题。
问题2:修改参数后编译报错的原因
C语言中,函数参数的读取顺序是从左到右。你把int matrix[row][column]作为第一个参数时,编译器解析到这里还没有读到row和column的定义,自然会报变量未声明的错误。
修复方案
采用C99及以上标准支持的变长数组参数写法,调整参数顺序,把长度参数放在数组参数之前即可:
#include <stdio.h> // 长度参数row、column放在数组参数之前 void matrixInput(int row, int column, int matrix[row][column], int matrixNo) { printf("Matrix %d input:\n", matrixNo); for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { printf("Matrix %d [%d, %d]: ", matrixNo, i + 1, j + 1); scanf("%d", &matrix[i][j]); } } printf("\n"); } void matrixDisplay(int row, int column, int matrix[row][column], int matrixNo) { printf("Matrix %d output:\n", matrixNo); for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { printf("%d ", matrix[i][j]); } printf("\n"); } printf("\n"); } int main() { int row, column; printf("Row: "); scanf("%d", &row); printf("Column: "); scanf("%d", &column); int matrix1[row][column], matrix2[row][column]; // 调用函数时参数顺序对应调整 matrixInput(row, column, matrix1, 1); matrixInput(row, column, matrix2, 2); matrixDisplay(row, column, matrix1, 1); matrixDisplay(row, column, matrix2, 2); return 0; }
如果你的编译器默认不支持C99标准,编译时添加-std=c99参数即可(GCC/Clang适用)。
内容的提问来源于stack exchange,提问作者Satyajit Roy
相关产品推荐
相关产品推荐

