我知道使用超出数组范围的索引会导致未定义的行为。
但是多维数组呢?
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
而不是未定义的行为? 答案 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
),这说明了您看到的结果。