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

D语言二维数组索引变量使用时出现越界问题求助

D语言二维数组索引越界问题解决

问题根源

D语言中多维数组的声明顺序和C/C++完全相反:

  • C/C++里float NOTAS[8][4]表示8行4列的二维数组
  • 但D语言里float[8][4] NOTAS的含义是:一个包含4个元素的数组,每个元素是长度为8的float数组(即4行8列)

你的循环逻辑是处理8个学生(对应行)、每个学生4个成绩(对应列),但数组实际只有4行,当循环到第5个学生(I=4)时,就会触发索引越界。

修正后的代码

把数组声明改成float[4][8] NOTAS,外层数组长度为8(对应8个学生),每个元素是长度为4的float数组(对应每个学生的4个成绩):

import std.stdio;

void main()
{
    float[4][8] NOTAS; // 修正数组维度顺序:8个学生,每个4个成绩
    int I, J;

    writeln("2D ARRAY - INPUT AND OUTPUT\n");

    for (I = 0; I < 8; I++)
    {
        writefln("Enter grades for student %d:", I + 1);
        for (J = 0; J < 4; J++)
        {
            writef("Grade ==> %d: ", J + 1);
            readf(" %f", &NOTAS[I][J]);
        }
        writeln();
    }

    writeln("\nGRADE REPORT\n");
    writeln("Student Grade1 Grade2 Grade3 Grade4");
    writeln("------- ------ ------ ------ ------");

    for (I = 0; I < 8; I++)
    {
        writef("%7d", I + 1);
        for (J = 0; J < 4; J++)
        {
            writef("%7.1f", NOTAS[I][J]);
        }
        writeln();
    }
}

为什么之前的修改无效?

  • 把I < 8改成I <=7:循环次数未变,还是8次,数组依然只有4行,仍会越界
  • 改成float[9][5]:依然搞反了维度顺序,变成5行9列,循环到第6个学生时仍会触发越界

额外说明

D语言的多维数组是数组的数组,声明时从内到外是元素数组的长度,外层是包含的数组数量。比如T[N][M]表示M个元素,每个元素是N个T类型的数组,对应逻辑上的M行N列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:10:27