多维数组的索引超出范围是否是未定义的行为?

时间:2019-02-23 21:22:56

标签: c++ multidimensional-array

我知道使用超出数组范围的索引会导致未定义的行为。

但是多维数组呢?

int aa[][2]{ {5,7}, {23, 16}, {81, 83} };
    cout << aa[0][0] << endl;
    cout << (*aa)[0] << endl;
    cout << aa[0][1] << endl;
    cout << (*aa)[1] << endl;
    cout << aa[0][2] << endl; // here
    cout << (*aa)[2] << endl; // and here
  • 数组aa上方是3个2整数数组的数组。因此Column的大小为2。因此索引应该在0-->1范围内,但是当我使用aa[0][2]时得到23而不是未定义的行为?

1 个答案:

答案 0 :(得分:3)

实际上,您看到的结果是因为,是因为当您越界访问数组时,编译器会使用UB。

当您通过aa[i][j]访问变量时,编译器将按以下方式计算访问的地址(C使用row-major-order内存布局):

address_of(aa)+2*i+j  # 2 elements in a row

但是如果i或/和j超出范围怎么办?编译器应该做什么?

如果不是UB,则编译器必须发出一些代码来检查范围,如果违反范围,则会引发错误。

但是因为这种情况 UB,所以允许程序执行任何喜欢的操作:

  • 格式化硬盘
  • 从您的帐户发送尴尬邮件
  • 崩溃
  • 只需应用上面的公式

对于编译器程序员来说,简便的方法是选择最后一个选项,这对我所知道的所有编译器都是如此(但您无权假设将来会出现这种情况-也许是卑鄙的编译器-程序员将选择前两个选项之一!)。

使用上述公式,aa[0][2]的地址与aa[1][0]的地址相同(即偏移量2),这说明了您看到的结果。