C语言矩阵第二列输出异常:预期0却显示2的问题排查
问题分析与修复方案
你的代码存在几个关键问题,导致第二列输出异常,以下是逐一分析和修复:
1. 零大小全局数组的致命错误
你定义了int array[0][0];和int array2[0][0];,C语言中不允许定义大小为0的数组,这属于未定义行为。后续对数组的读写操作都会触发内存越界,导致不可预测的结果(比如你看到的第二列输出2)。
2. createMatrix函数的初始化逻辑错误
在createMatrix中,你循环里写的是:
array[matrixx][matrixy] = 0;
这完全错误——你应该用循环变量i(行)和x(列)来定位元素,而不是用矩阵的总行列数matrixx和matrixy(这两个值作为下标会直接越界)。正确的初始化应该是:
array[i][x] = 0;
另外,函数参数缺少类型声明,应该修正为void createMatrix(int matrixx, int matrixy),避免隐式类型转换带来的问题。
3. 第二个矩阵的创建与打印错误
在main函数中,你创建第二个矩阵时仍然调用了createMatrix(操作的是array),而不是createMatrix2(操作array2);同时printMatrix函数只打印array,没有处理array2的逻辑。
修复后的完整代码
针对以上问题,我们改用动态内存分配来创建可变大小的矩阵(避免零数组和变长数组的限制),同时修正所有逻辑错误:
#include <stdio.h> #include <stdlib.h> // 动态分配矩阵内存并初始化 int** createMatrix(int rows, int cols) { int** matrix = (int**)malloc(rows * sizeof(int*)); for (int i = 0; i < rows; i++) { matrix[i] = (int*)malloc(cols * sizeof(int)); for (int x = 0; x < cols; x++) { matrix[i][x] = 0; // 用循环变量初始化每个元素 } } return matrix; } // 打印矩阵 void printMatrix(int** matrix, int rows, int columns) { for (int i = 0; i < rows; i++) { for (int x = 0; x < columns; x++) { printf("r%d, c%d: %d ", i + 1, x + 1, matrix[i][x]); } printf("\n"); } } // 释放矩阵内存 void freeMatrix(int** matrix, int rows) { for (int i = 0; i < rows; i++) { free(matrix[i]); } free(matrix); } int main(void) { int whatMatrixAreWeOn = 1; int iRows, iColumns; int** matrix1 = NULL; int** matrix2 = NULL; // 创建并打印第一个矩阵 printf("Input how many rows you want for matrix %d: ", whatMatrixAreWeOn); scanf("%d", &iRows); printf("Input how many columns you want for matrix %d: ", whatMatrixAreWeOn); scanf("%d", &iColumns); matrix1 = createMatrix(iRows, iColumns); printMatrix(matrix1, iRows, iColumns); // 创建并打印第二个矩阵 whatMatrixAreWeOn += 1; printf("Input how many rows you want for matrix %d: ", whatMatrixAreWeOn); scanf("%d", &iRows); printf("Input how many columns you want for matrix %d: ", whatMatrixAreWeOn); scanf("%d", &iColumns); matrix2 = createMatrix(iRows, iColumns); printMatrix(matrix2, iRows, iColumns); // 释放内存 freeMatrix(matrix1, iRows); freeMatrix(matrix2, iRows); return 0; }
额外说明
- 动态分配的矩阵使用完后必须调用
freeMatrix释放内存,避免内存泄漏。 - 如果你的编译器支持C99标准,也可以在main函数中使用变长数组(VLA),但变长数组不能全局定义,且栈内存有限,不适合过大的矩阵。
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

