Насколько я знаю, многомерный массив в стеке будет занимать непрерывную память в порядке строк. Является ли поведение undefined индексировать многомерный массив, используя указатель на элементы в соответствии со стандартом ISO С++? Например:
#include <iostream>
#include <type_traits>
int main() {
int a[5][4]{{1,2,3,4},{},{5,6,7,8}};
constexpr auto sz = sizeof(a) / sizeof(std::remove_all_extents<decltype(a)>::type);
int *p = &a[0][0];
int i = p[11]; // <-- here
p[19] = 20; // <-- here
for (int k = 0; k < sz; ++k)
std::cout << p[k] << ' '; // <-- and here
return 0;
}
Выше код будет компилироваться и запускаться правильно, если указатель не выходит из границы массива a
. Но происходит ли это из-за того, что поведение компилятора или язык стандартно? Любая ссылка из стандарта ISO С++ была бы лучше всего.