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”,包含int
s,即(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++中二维数组的内存分配的主要内容,如果未能解决你的问题,请参考以下文章