c++多维数组的内存布局是怎样的

等等,我昨天调试代码时遇到个怪事。
明明写的是int arr[3 ][4 ],结果访问arr[3 ][2 ]时,程序直接崩溃了,输出一大堆乱码。
当时以为是越界访问,后来发现是数组初始化超界了。
这让我想起二维数组按行存储的细节——第一行存满才存第二行。
如果int是4 字节,那arr[3 ][2 ]的地址应该是起始地址+(3 4 +2 )4 =5 6 字节处,但arr只有1 2 个元素,4 8 字节就结束了。
这要是按列优先存储就好了,访问arr[2 ][3 ]时不会越界。
不过转念一想,图像处理里矩阵转置时,按列优先就特别高效。
所以这事儿得这么看:行优先适合行遍历,列优先适合列操作。
但动态分配时,还是得按行优先来,毕竟new int[3 ]先分配指针,再分配数组。
突然想到三维数组,比如arr[2 ][3 ][4 ],访问arr[1 ][2 ][3 ]时,地址计算是(1 1 2 +2 4 +3 )4 =7 6 字节,这要是嵌套循环里这样访问,每次计算地址都算一次乘法,会不会变慢?还是说编译器能优化成寄存器操作?这得去查查汇编才知道。

对于二维数组,有行优先顺序和什么两种不同的存储方式

行优先存储,先存第一行,再存第二行。
列优先存储,先存第一列,再存第二列。
公式复杂,但关键看行和列。
缓存利用看顺序,行优先好。
多维度数,空间消耗大。
你自己掂量。

数据结构以行序存储的二维数组问题,地址是什么?

哎哟,说起来这个顺序存储,哎,我当年也懵了会儿。
哎,按行存储嘛,想象一下,就像你把一排排的书本摞起来,每摞有1 0本,然后从第1 1 本开始新的摞。
A[1 0,9 ]嘛,就是第1 0摞的第9 本书,A[1 0,5 ]就是第1 0摞的第5 本书,它们之间隔了4 本书,对吧。
然后A[1 8 ,9 ]和A[1 0,9 ]嘛,A[1 8 ,9 ]是第1 8 摞的第9 本书,那它就比A[1 0,9 ]多跳了8 摞,每摞有6 本书,所以是8 ×6 =4 8 本书,加上那4 本书,一共是5 2 本书,换算成存储单元,就是5 2 ×4 =2 08 个。
哎,所以A[1 8 ,9 ]的地址就应该是1 2 08 了。

再说说那个更一般的算法,哎,这个啊,它就像是个公式,基地址加上(行标之差乘以每行元素个数加上列标之差)乘以元素所占存储单元。
哎,听起来复杂,但其实简单,就是按照这个公式来算地址。
当时我算着算着,嗯,还挺有意思的。