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

C++二维数组值莫名改变?初始化后值异常变化求助

问题根源:数组越界与未定义行为

这是典型的数组越界访问引发的诡异问题,核心是你的数组维度和循环范围不匹配,加上二维数组的内存布局特性,导致值被意外覆盖。

一步步拆解原因:

  1. 数组维度分析
    已知len_a=5,len_b=4,你定义的数组等价于:

    int tab[6][5]; // len_a+1=6行,len_b+1=5列
    

    二维数组的索引从0开始,所以第二维的合法索引范围是0~4——tab[0][5]已经属于越界访问,它并不在当前行的内存空间里。

  2. 内存布局导致的“错位写入”
    C++中二维数组在内存里是按行连续存储的:tab[0]的5个元素(tab[0][0]到tab[0][4])之后,紧接着就是tab[1]的第一个元素tab[1][0]。你第一个循环里给tab[0][5]赋值为5,实际上是把值写到了tab[1][0]的内存位置上。

  3. 后续循环的覆盖操作
    第二个循环初始化首列时:

    for(int j=1;j<=len_b;j++) tab[j][0]=j;
    

    当j=1时,你给tab[1][0]赋值为1——这正好覆盖了之前存在这里的5,所以之后打印tab[0][5]时,读到的就是被覆盖后的1。

解决方法

  • 替换变长数组为标准容器:C++标准并不支持变长数组(VLA),int tab[len_a+1][len_b+1];是编译器扩展特性,建议用std::vector创建动态二维数组,更安全且符合标准:
    std::vector<std::vector<int>> tab(len_a+1, std::vector<int>(len_b+1, 0));
    
  • 修正循环范围:如果是类似编辑距离的动态规划场景,通常首行应该是tab[0][j] = j(j从0到len_b),首列是tab[i][0] = i(i从0到len_a),那第一个循环的终止条件应该是i<=len_b,而非i<=len_a,从根源避免越界。

重要提醒

数组越界属于未定义行为,有时候可能看似正常,有时候会出现奇怪的数值变化,甚至直接导致程序崩溃。一定要严格保证数组索引在合法范围内。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:36:28