C语言二维数组赋值输出异常乱值 如何得到预期运行结果
问题根本原因
- 赋值逻辑存在两处错误,直接导致数组未被正确初始化、下标越界,输出的乱码是栈内存未初始化的随机垃圾值:
- 自增运算符重复使用导致下标失控:for循环的迭代语句已经通过
i++、j++控制每次循环的步进,你在赋值语句tarr[i][j] = (i++) * (j++);中再次对两个下标变量做后置自增,相当于每次执行赋值操作时i、j都会额外加1,内层循环每轮j总共加2,外层i的增量也完全偏离预期,绝大多数合法的数组下标位置被直接跳过,根本没有被赋值。 - 越界写入会覆盖栈上的其他内存(包括循环变量、栈帧保留数据),进一步打乱循环执行流程,最终只有极少数数组位置被写入值,其余位置保留栈内存的原始随机值,也就是你看到的无意义异常数值。
- 就算自增问题修复,原有的
i*j计算逻辑也无法得到预期输出:C语言数组下标从0开始,你预期的结果是行号(1-3)和列号(1-4)的乘积,直接用0起始的下标相乘会得到错误的计算值。
- 自增运算符重复使用导致下标失控:for循环的迭代语句已经通过
修复方案
- 删除赋值语句中多余的
i++、j++操作,仅保留for循环头的步进逻辑,保证下标遍历范围完全覆盖3行4列的所有数组元素,不会出现越界。 - 调整赋值计算逻辑,将0起始的i、j分别加1后相乘,匹配预期的行列乘积规则。
修复后的完整可运行代码:
#include <stdio.h> int main() { int tarr[3][4]; // 二维数组赋值 for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { tarr[i][j] = (i + 1) * (j + 1); } } // 遍历输出二维数组 for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { printf("%d ", tarr[i][j]); } printf("\n"); } return 0; }
编译运行后即可得到预期输出:
1 2 3 4 2 4 6 8 3 6 9 12
内容的提问来源于stack exchange,提问作者jewanC
相关产品推荐
相关产品推荐

