我觉得我在C风格阵列上表现得很好,显然不是。我无法解决这个问题。
假设我声明了一个函数
void RotateMatrix(int ** matrix, int n)
{
auto x = matrix[0][0];
}
(假设矩阵是正方形)。从主要功能
开车void main()
{
int matrix[4][4] =
{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}
};
RotateMatrix((int**) matrix, 4);
}
基本上,matrix[0][1]
会导致缓冲区溢出。调试它,matrix[0][0]
尝试转到地址0x0000000200000001
,这是数组中前8个字节的组合,可能是int为4个字节,int*
为8个字节,int**
1}}是指向int的指针的指针,因此它将前2个矩阵条目视为int*
。然而,这让我很困惑,因为像How to pass a multidimensional array to a function in C and C++上的bobobobo这样的答案似乎表明你可以使用int**
方法。我很困惑。我已经看到其他SO帖子说同样的话,为什么它对他们有用呢?
我认为matrix[0][0]
它会matrix[0]
的地址加上offset 0 * sizeof(int)
(这仍然是第一个元素)
答案 0 :(得分:2)
数组数组不是指向指针的指针,而是指向数组的指针。因此,数组int matrix[4][4]
不会衰变为int **
,而是变为int (*)[4]
。
这就是为什么你需要摆脱演员并改变RotateMatrix
的签名。