c++中二维数组的内存分配

Posted

技术标签:

【中文标题】c++中二维数组的内存分配【英文标题】:Memory allocation for a 2D array in 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 元素。有人可以解释这里发生了什么,该解决方案是错误的还是我误解了以前的答案。

【问题讨论】:

【参考方案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. ***.com/a/21580967/4384418

以上是关于c++中二维数组的内存分配的主要内容,如果未能解决你的问题,请参考以下文章

c++中二维数组的内存分配

c++ 二维数组内存分配

需要有关 C++ 中二维数组的动态内存分配的帮助

在 C++ 中使用动态内存分配创建二维数组

C++:使用函数为二维数组分配内存时出错

如何在 C++ 中为二维对象数组分配内存? [复制]