如何将运行时内存分配给数组size[4][3]
?
IEint a[4][3]
如果需要在运行时为数组分配内存,而不是如何为 2D 数组或 3D 数组分配内存。
根据评论编辑答案。为每个维度单独分配。对于 2D 阵列,需要 2 级分配。
*a = (int**)malloc(numberOfRows*sizeof(int*));
for(int i=0; i<numberOfRows; i++)
{
(*arr)[i] = (int*)malloc(numberOfColumns*sizeof(int));
}
你试过什么。 new int[4][3]
是一个完全有效的表达式,并且可以将结果分配给具有适当类型的变量:
int (*array2D)[3] = new int[4][3];
话虽如此:我真的想不出一个合适的案例。实际上,只要您需要一个二维数组,就应该定义一个实现它的类(std::vector<int>
用于实际内存)。
纯 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 个维度,这一点尤其重要。
缺点是访问语法更复杂,因为您需要在能够索引之前取消引用指针。
动态分配 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;
您可以使用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;
}
在 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) == 1
和do not cast malloc result
。
使用calloc,我想这会做。
int **p;
p=(int**)calloc(4,sizeof(int));
您可以在 c 中使用 malloc() 或在 c++ 中使用 new 进行动态内存分配。