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

C语言二维数组赋值输出异常乱值 如何得到预期运行结果

问题根本原因
  • 赋值逻辑存在两处错误,直接导致数组未被正确初始化、下标越界,输出的乱码是栈内存未初始化的随机垃圾值:
    1. 自增运算符重复使用导致下标失控:for循环的迭代语句已经通过i++、j++控制每次循环的步进,你在赋值语句tarr[i][j] = (i++) * (j++);中再次对两个下标变量做后置自增,相当于每次执行赋值操作时i、j都会额外加1,内层循环每轮j总共加2,外层i的增量也完全偏离预期,绝大多数合法的数组下标位置被直接跳过,根本没有被赋值。
    2. 越界写入会覆盖栈上的其他内存(包括循环变量、栈帧保留数据),进一步打乱循环执行流程,最终只有极少数数组位置被写入值,其余位置保留栈内存的原始随机值,也就是你看到的无意义异常数值。
    3. 就算自增问题修复,原有的i*j计算逻辑也无法得到预期输出:C语言数组下标从0开始,你预期的结果是行号(1-3)和列号(1-4)的乘积,直接用0起始的下标相乘会得到错误的计算值。
修复方案
  1. 删除赋值语句中多余的i++、j++操作,仅保留for循环头的步进逻辑,保证下标遍历范围完全覆盖3行4列的所有数组元素,不会出现越界。
  2. 调整赋值计算逻辑,将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:54:22