在初学阶段,曾学过二维数组的内存空间是连续分布的,参考下图:
后来由于动态申请二维数组的方法不常用(一般都是用vector或者直接定义一个二维数组),所以就一直以为二维数组的内存空间是连续的。但实际上,只有非动态申请的二维数组的内存空间是连续的,动态申请的二维数组是不连续的!
这是因为,动态申请一个二维数组的流程一般是,先 new/malloc 出二维数组的行,然后在一个循环内再分别 new/malloc 出每一列的内容。例如:
int **arr = new int*[3]; // 先new出行
// 再循环new出列中的内容
for(int i = 0; i < 3; i++)
{
arr[i] = new int[2]{i, i+1};
}
所以动态申请的二维数组,其行之间是连续的,而列之内也是连续的,但每一个列之间却是不连续的,具体参考下图: