据我所知,堆栈上的多维数组将按行顺序占用连续内存.根据ISO C++标准使用指向元素的指针索引多维数组是不确定的行为?例如:
#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;
}
Run Code Online (Sandbox Code Playgroud)
如果指针没有超出数组的边界,上面的代码将编译并正确运行a.但这是否因为编译器定义的行为或语言标准而发生?ISO C++标准中的任何参考都是最好的.