多维数组下标越界更隐蔽,需逐维独立检查边界;二维数组a3合法索引为i∈[0,2]、j∈[0,3];静态数组可用sizeof推导维度,动态分配需显式保存尺寸;推荐使用std::vector::at()或numpy等带自动检查的容器。

多维数组下标越界比一维更隐蔽,因为每个维度都要独立检查。不检查任一维,都可能访问到非法内存或引发异常。
明确各维度的有效范围
二维数组 int a[3][4] 实际是 3 行 × 4 列,合法索引为 a[i][j],其中 i ∈ [0, 2]、j ∈ [0, 3]。不能只记“总元素数=12”,而忽略行列约束。
- 声明时的尺寸就是硬边界:第一维上限是行数(不是列数),第二维上限是列数
- 用
sizeof(a)/sizeof(a[0])得行数,sizeof(a[0])/sizeof(a[0][0])得列数——适用于栈上静态数组 - 动态分配(如
new int*[m])需单独保存每维长度,无法靠sizeof推导
逐维做边界检查,不可跳过任一维
访问 a[i][j][k] 前,必须分别验证 i、j、k 是否各自落在对应维度范围内。合并判断(如 i * cols * depth + j * depth + k )容易出错且失去语义清晰性。
- C/C++ 中推荐写成嵌套 if 或连写条件:
if (i >= 0 && i = 0 && j = 0 && k - Python 的
list多层嵌套也同理:先确认len(lst) > i,再确认len(lst[i]) > j,依此类推 - 避免用单一索引模拟多维:比如把三维当成一维算偏移,极易因尺寸理解偏差导致越界
优先使用带检查的容器或封装接口
原生数组缺乏维度信息和自动防护,应主动降级风险。
- C++ 可用
std::vector<:vector>></:vector>配合.at():支持逐层抛异常,v.at(i).at(j).at(k) - 自定义多维数组类,内部存储维度元数据,在
operator()中统一做全维校验 - Python 可用
numpy.ndarray:索引越界直接报IndexError,且支持负索引与切片自动截断
警惕指针运算和偏移计算中的隐式越界
用指针遍历多维数组(如 int* p = &a[0][0])时,手动计算 *(p + i*cols + j) 必须确保 i*cols + j ,否则仍会越界。
- 尤其注意:指针加法不感知维度,只按字节偏移,一旦系数错(如把
cols写成rows),立刻越界 - 循环变量超出某维上限(如
for (j = 0; j 多走一次)是高频错误点 - 调试时可用 AddressSanitizer(ASan)捕获此类内存访问违规,比运行时异常更早暴露问题

















