-1

如何将运行时内存分配给数组size[4][3]

IEint a[4][3]

如果需要在运行时为数组分配内存,而不是如何为 2D 数组或 3D 数组分配内存。

4

8 回答 8

2

根据评论编辑答案。为每个维度单独分配。对于 2D 阵列,需要 2 级分配。

*a = (int**)malloc(numberOfRows*sizeof(int*));
for(int i=0; i<numberOfRows; i++)
    {
    (*arr)[i] = (int*)malloc(numberOfColumns*sizeof(int));
    }
于 2013-10-17T08:16:21.717 回答
1

你试过什么。 new int[4][3]是一个完全有效的表达式,并且可以将结果分配给具有适当类型的变量:

int (*array2D)[3] = new int[4][3];

话虽如此:我真的想不出一个合适的案例。实际上,只要您需要一个二维数组,就应该定义一个实现它的类(std::vector<int>用于实际内存)。

于 2013-10-17T08:49:03.253 回答
1

纯 C 方法如下:

int (*size)[4][3];

size = malloc(sizeof *size);

/* Verify size is not NULL */

/* Example of access */
(*size)[1][2] = 89;

/* Do something useful */

/* Deallocate */
free(size);

好处是通过不分配中间指针消耗更少的内存,处理单个内​​存块并且释放更简单。如果您开始拥有超过 2 个维度,这一点尤其重要。

缺点是访问语法更复杂,因为您需要在能够索引之前取消引用指针。

于 2013-10-17T20:44:23.277 回答
1

动态分配 int[4][3] 类型数组的最简单方法如下

int ( *a )[3] = new int[4][3];

// 一些使用数组的东西

删除[]a;

另一种方法是分配几个数组。例如

int **a = 新的 int * [4];

for ( size_t i = 0; i < 4; i++ ) a[i] = new int[3];

// 一些使用数组的东西

for ( size_t i = 0; i < 4; i++ ) 删除 []a[i];

删除[]a;

于 2013-10-17T08:48:15.163 回答
0

您可以使用std::vector<>它,因为它是一个模板化容器(意味着数组元素可以是您需要的任何类型)。std::vector<>允许动态内存使用(您可以在需要时更改 vector<> 的大小。内存已自动分配和释放)。

例如:

#include <iostream>
#include <vector>

using namespace std; // saves you from having to write std:: in front of everthing

int main()
{
    vector<int> vA;
    vA.resize(4*3); // allocate memory for 12 elements

    // Or, if you prefer working with arrays of arrays (vectors of vectors)
    vector<vector<int> > vB;
    vB.resize(4);
    for (int i = 0; i < vB.size(); ++i)
        vB[i].resize(3);

    // Now you can access the elements the same as you would for an array
    cout << "The last element is " << vB[3][2] << endl;
}
于 2013-10-18T04:58:48.177 回答
0

在 C 中,您可以使用指向指针的指针

正如@Lundin 提到的,这不是二维数组。它是一个查找表,使用指向在整个堆中分配的碎片内存区域的指针。

您需要分配所需的指针数量,然后分配每个指针。您可以根据您的要求分配固定大小或可变大小

  //step-1: pointer to row
  int **a = malloc(sizeof(int *) * MAX_NUMBER_OF_POINTERS);
  //step-2: for each rows
  for(i = 0; i < MAX_NUMBER_OF_POINTERS; i++){
    //if you want to allocate variable sizes read them here
    a[i] = malloc(sizeof(int) * MAX_SIZE_FOR_EACH_POINTER);  // where as if you use character pointer always allocate one byte extra for null character
  } 

好像要分配 char 指针避免使用sizeof(char)inside for 循环。因为sizeof(char) == 1do not cast malloc result

请参阅如何在 C++ 中使用 new 声明二维数组

于 2013-10-17T08:25:38.533 回答
0

使用calloc,我想这会做。

int **p;
p=(int**)calloc(4,sizeof(int));
于 2013-10-17T08:19:59.730 回答
-2

您可以在 c 中使用 malloc() 或在 c++ 中使用 new 进行动态内存分配。

于 2013-10-17T08:36:08.273 回答