【问题标题】:Memory allocation for a 2D array in c++c++中二维数组的内存分配
【发布时间】:2016-12-15 06:25:03
【问题描述】:

我是 C++ 新手,并试图了解如何为 2D 数组分配内存。我已经经历了 SOF 中的几个线程和这些答案。

answer1

answer2

这些答案表明,二维数组和普通数组一样会发生连续的内存分配。 (如果我错了,请纠正我)答案 2 提到它应该能够使用*(array + (i * ROW_SIZE) + j) 访问array[i][j] th 元素

但是当我尝试这样做时,它给了我一个意想不到的结果。

代码:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int array[2][2] = { {1, 2}, {3, 4} };
    cout<<*((array+1*2) + 1)<<endl;  
    cout<<**((array+1*2) + 1)<<endl;  
    return 0;
}

结果:

0x76e1f4799008
2012576581

它没有给我array[i][j] th 元素。有人可以解释这里发生了什么,该解决方案是错误的还是我误解了以前的答案。

【问题讨论】:

    标签: c++ arrays


    【解决方案1】:

    首先你必须得到一个指向整个事物的第一个元素的指针,即不仅仅是第一行:

    int *p = &array[0][0]
    

    之后,您可以随意索引p

    std::cout << *(p + 1*2 + 1) << std::endl;
    

    您最初尝试失败的原因与类型有关。发生的情况是,在您的第一次尝试中,您正在尝试评估

    *(array + 1*2 + 1)
    

    现在,array 的类型为“array-of-length-2”,包含“array-of-length-2”,包含ints,即(int[2])[2],这将增加array其元素的大小是其元素的 3 倍,而这些元素又是 int[2]这会跳出你的数组。 事实上*(array+3) 等价于array[3]。现在,这显然是 int[2] 类型的东西,当您尝试打印它时,它会衰减为指针。在您的第二次尝试中,您取消引用它,产生类似 array[3][0] 的东西,它现在是正确的类型,但同样指向数组之外。

    【讨论】:

      【解决方案2】:

      更像是像这样将二维数组模拟为一维数组

      0 1 2
      3 4 5
      6 7 8
      

      并且数组将是 0 1 2 3 4 5 6 7 8 访问 4 它应该是 *(a[0]+(1*3)+1)a[0] 与 a(name of数组)。

      【讨论】:

        【解决方案3】:

        数组是二维指针

        **array = array[0][0]
        *(*array + j) = array[0][j]
        *(*(array+i) + j) = array[i][j]
        

        【讨论】:

        • 是的.. 没错,但该解决方案与(array + (i * ROW_SIZE) + j) 不相等。我想知道(array + (i * ROW_SIZE) + j)是错的还是我做错了什么。
        • 这个答案说An array of arrays is not the same as a pointer to a pointer. stackoverflow.com/a/21580967/4384418
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-05
        • 1970-01-01
        • 2018-07-14
        • 1970-01-01
        • 2016-06-21
        • 2013-02-10
        • 2014-07-19
        相关资源
        最近更新 更多