在以下代码中,
int arr[3][2][2]={1,2,3,4,5,6,7,8,9,10,11,12};
cout<<arr[0][0][5]<<endl;
cout<<arr[1][3][0]<<endl;
我输出为6和11。
如何将元素索引到其范围之外?
例如 - 这里的尺寸是,深度= 3 col = 2行= 2,在这种情况下,arr [0] [0] [5]表示第5行,它不存在!任何人都可以对此有所了解。
答案 0 :(得分:3)
从技术上讲,您正在调用未定义的行为。 *
但是,最有可能的是,正在发生的事情是编译器正在计算要读取的地址:
(int *)arr + x*(2*2) + y*2 + z
因为您的3D数组实际上是作为连续的线性数组存储在内存中。
所以在你的[0][0][5]
情况下,它只是读取该线性数组的(0 * 4 + 0 * 2 + 5)=第5个元素(从零开始),即6
。< / p>
类似于[1][3][0]
,它正在读取(1 * 4 + 3 * 2 + 0)=第10个元素,即11
。
*我在一个问题中讨论过这个问题:One-dimensional access to a multidimensional array: well-defined C?。
答案 1 :(得分:1)
还记得上次你有一个忘了终止的C风格字符串吗?
char str[] = {'a','b','c'};
cout << str;
还记得你之后如何在内存中打印“abc”然后随机的gubbins,因为程序一直在读取数组吗?
它会那样做;它会继续前进并拉出正常情况,即使这样做是 undefined 。编译器根本不需要警告你这个;你应该为自己解决这个问题。
在您的情况下,下一行的数据可能恰好在该位置的内存中。
答案 2 :(得分:0)
就像那样:
int arr[depth][col][row];
int temp = arr[x][y][z];
然后temp = arr[x * (col * row) + y * row + z]