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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:40:41