在本地声明二维数组并以非常量大小存储在堆上

时间:2017-12-07 16:05:53

标签: c multidimensional-array memory-management

在C中声明例如int ar[x][y];它实际上是int[x*y],您的调用是以所需方式编译的 但是如果在函数内部生成,则此数组存储在堆栈中。 我正在寻找一种方法将它存储在堆上,同时具有相同的功能。因为当我正在寻找一种方法时,我发现的唯一的事情就是make int**然后每个元素(类型int*)都是指向另一个数组的指针。 (纠正我,如果我错了)它似乎是合法的,但第二种方式不是一个接一个地存储值,也使用更多的内存。对于ar[x][y],第一种方法只是x*y*sizeof(int),但第二种方法是x*y*sizeof(int)+x*sizeof(int*)

总结是可以在堆上存储二维数组,同时保持int ar[x][y]的功能吗?

编辑:我很抱歉误导所有人,但ar[3][4]只是一个例子,我实际上是在寻找一种方法来实现非常规的大小。

EDIT2:其实我甚至都在寻找能够在原始C中使用的东西。

1 个答案:

答案 0 :(得分:0)

如果在编译时至少知道其中一个大小,则可以使用标准C ++容器:

 using my2daraytype  = std::array<std::array<int, N>, M>; // both N and M are compile time constants
 // allocate this on the heap normally (e.g. with std::make_unique)
 // example
 auto myarray = std::make_unique<my2daraytype>();

请注意,上面的myarray是指向2d数组的(智能)指针,因此您可以将其作为(*myarray)[i][i]进行访问。

 using my2daraytype = std::vector<std::array<int, N>>; // inner size N is known
 // data already lives on the heap, no need to allocate
 // example
 my2darraytype myarray(M); 

这个不是指针,因此您使用myarray[i][j]

当两种尺寸都在运行时确定时,这并不容易。 std::vector<std::vector<int>>内存的组织方式与int**类似,因此不适用。您可能希望创建自己的类,在内部存储大小为std::vector<int>的{​​{1}},并为索引提供两个参数M*N。具有两级方括号的熟悉语法是可能的,但是过于复杂且可能效率低下,因此很少值得麻烦。 int& operator()(size_t, size_t)完美无缺,只需使用它。

这是为了方便而模板化的一个可能的基本概要(未完成,未完成):

myarray(i,j)

需要更多代码才能完全正常运行,但这是基础。