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

C语言矩阵生成程序显示正常但返回值异常,参数修改后数据错乱

问题分析与修复方案

你的程序出现崩溃(返回值3221226356)和垃圾数据的核心原因是矩阵元素的索引计算错误,同时还有几个可优化的细节,以下是具体修复步骤:

1. 修正索引计算逻辑

在create_matrix和display_matrix函数中,你错误地使用i*rows + j作为元素偏移量。正确的计算应该是i*colombs + j——因为矩阵每行包含colombs个元素,第i行的起始偏移量是i*colombs,加上列索引j才是对应元素的正确位置。

原错误代码片段:

printf("%5d ",matrix[i*rows+j]);
// 以及
matrix[i*rows+j]=(rand()%(max-min+1))+min;

修正后:

printf("%5d ",matrix[i*colombs+j]);
// 以及
matrix[i*colombs+j]=(rand()%(max-min+1))+min;

当行数和列数不等时,原索引计算会超出calloc分配的内存范围,触发内存访问错误(对应返回值3221226356);如果强行修改参数让行列数相等,虽不会崩溃,但部分元素位置计算仍错误,导致出现垃圾数据。

2. 初始化随机数生成器

当前程序中rand()生成的随机序列固定,需在main函数开头添加srand(time(NULL));,用当前时间作为随机种子,让每次运行生成不同的随机矩阵。

3. 替换全局变量为局部变量

全局变量i和j易引发意外的变量污染,建议在每个函数内声明局部变量:
例如在display_matrix中:

void display_matrix(int matrix[],int rows,int colombs){
    int i,j; // 局部变量
    for(i=0;i<rows;i++){
        for(j=0;j<colombs;j++)
            printf("%5d ",matrix[i*colombs+j]);
        printf("\n");
    }
}

create_matrix函数同理修改。

4. 检查内存分配是否成功

calloc可能分配失败(返回NULL),需添加检查逻辑避免访问空指针:

int *create_matrix(int rows,int colombs,int min,int max){
    int *matrix=calloc(colombs*rows,sizeof(int));
    if(matrix == NULL){
        printf("内存分配失败\n");
        exit(1);
    }
    // 后续代码
}

完整修复后的代码

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

void display_matrix(int matrix[],int rows,int colombs){
    int i,j;
    for(i=0;i<rows;i++){
        for(j=0;j<colombs;j++)
            printf("%5d ",matrix[i*colombs+j]);
        printf("\n");
    }
}

int *create_matrix(int rows,int colombs,int min,int max){
    int *matrix=calloc(colombs*rows,sizeof(int));
    if(matrix == NULL){
        printf("内存分配失败\n");
        exit(1);
    }
    int i,j;
    for(i=0;i<rows;i++)
        for(j=0;j<colombs;j++)
            matrix[i*colombs+j]=(rand()%(max-min+1))+min;
    
    return matrix;
}

int main(){
    srand(time(NULL));
    int *m=NULL,row,col;
    
    do{
        printf("请输入行数:\n");
        scanf("%d",&row);
    }while(row<=0);
    
    do{
        printf("请输入列数:\n");
        scanf("%d",&col);
    }while(col<=0);
    
    m=create_matrix(row,col,10,99);
    display_matrix(m,row,col);

    free(m); // 释放分配的内存,避免内存泄漏
    return 0;
}

额外说明

  • 修复后程序返回值会变为0(正常退出),矩阵显示也不会出现垃圾数据
  • 代码末尾添加了free(m);,释放calloc分配的内存,避免内存泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 19:27:50