【问题标题】:double pointer (int**) and double brackets to get the value from a 2D array双指针(int**)和双括号从二维数组中获取值
【发布时间】: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


【解决方案1】:

数组的数组不会衰减为指向指针的指针,而是衰减为指向数组的指针。所以数组int matrix[4][4] 不会衰减到int **,而是衰减到int (*)[4]

这就是为什么你需要摆脱演员并更改RotateMatrix的签名。

【讨论】:

    猜你喜欢
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    相关资源
    最近更新 更多