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

3×3矩阵求和程序中数组值意外篡改问题排查

矩阵求和时数值意外篡改的问题解决

嘿,我仔细看了你的代码,一下子就找到问题的根源了——这是数组越界访问引发的未定义行为!

问题分析

你代码里定义的三个矩阵:

int matrix1[2][2];
int matrix2[2][2];
int sumMatrix[2][2];

都是2×2的数组,对应的合法索引范围是i从0到1,j从0到1。但你所有的循环逻辑都是:

for(int i = 0; i<3; i++){
  for(int j = 0; j<3; j++){
    // ... 读写数组元素
  }
}

这意味着你要访问3×3的元素,完全超出了数组的边界。C语言不会自动检查数组越界,当你访问matrix1[2][0]这类超出范围的元素时,会直接读写相邻的内存区域——这就会导致其他变量(比如另一个矩阵的元素)被意外篡改。而且因为程序运行时的内存布局不是固定的,这种问题不会每次都出现,这正是未定义行为的典型表现。

修正后的代码

只需要把数组的定义改成3×3的,和你的循环逻辑匹配就行:

#include<stdio.h>
int main(){ // 注意:main函数标准返回类型是int,不是void
 int matrix1[3][3];
 int matrix2[3][3];
 int sumMatrix[3][3];
 for(int i = 0; i<3; i++){
  for(int j = 0; j<3; j++){
   printf("Matrix[%d][%d]\n", i, j);
   printf("Enter matrix one's values> ");
   scanf("%d", &matrix1[i][j]);
  }
  printf("\n");
 }
 for(int i = 0; i<3; i++){
  for(int j = 0; j<3; j++){
   printf("Matrix[%d][%d]\n", i, j);
   printf("Enter matrix two's values> ");
   scanf("%d", &matrix2[i][j]);
  }
  printf("\n");
 }
 for(int i = 0; i<3; i++){
  for(int j = 0; j<3; j++){
   sumMatrix[i][j] = matrix1[i][j] + matrix2[i][j];
  }
 }
 // 打印三个矩阵
 for(int i = 0; i<3; i++){
  for(int j = 0; j<3; j++){
   printf("%d ", matrix1[i][j]);
  }
  printf("\n");
 }
 printf("\n");
 for(int i = 0; i<3; i++){
  for(int j = 0; j<3; j++){
   printf("%d ", matrix2[i][j]);
  }
  printf("\n");
 }
 printf("\n");
 for(int i = 0; i<3; i++){
  for(int j = 0; j<3; j++){
   printf("%d ", sumMatrix[i][j]);
  }
  printf("\n");
 }
 return 0; // 标准main函数需要返回值
}

另外我还顺手修正了两个小细节:

  • 把void main()改成了标准的int main(),并添加了return 0;,这是C语言的规范写法。
  • 保持了你的循环逻辑不变,因为你本来就是要处理3×3的矩阵。

这样修改后,数组的大小和循环的范围匹配,就不会再出现越界访问的问题,矩阵的数值也不会被意外篡改了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:49:06