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
相关产品推荐
相关产品推荐

