【发布时间】:2018-01-28 01:26:07
【问题描述】:
我认为我在 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**是指向a的指针整数的指针,因此它将前 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)(这仍然是第一个元素)
【问题讨论】:
-
不要使用演员表。每当你转换时,你就误解了类型系统。
-
spidy sense 告诉我这可能是因为动态数组分配,您实际上分配了一个 int* 数组,然后为每一行分配一个 int 数组。对吗?
-
阅读AnT's answer 在您在问题中链接的同一线程中。
matrix不会在int**中衰减,而是在int (*)[4]中衰减。 -
如果您删除了演员表,编译器会清楚地向您显示错误。当你应用演员表时,你告诉编译器“闭嘴,别管我,我知道我在做什么”。编译器知道得更好,试图让你知道,但你没有听,继续进行演员表。
标签: c++ arrays matrix multidimensional-array