为int的指针数组动态分配内存

时间:2016-10-25 05:03:16

标签: c++ pointers

如果我想为int的指针数组动态分配内存,我该如何实现这个要求?

假设我像这样声明一个int指针数组:

int (* mat)[];

有没有办法可以动态地为K个指针分配内存并将其分配给mat?如果我做

mat = new int * [K];

它出错:cannot convert 'int**' to 'int (*)[]' in assignment。我理解这个内存分配被隐式转换为int **。有没有办法为上面的场景分配内存?

即使我尝试将静态分配的int指针数组分配给int的指针数组,如下所示:

int (*mat)[] = NULL;
int (* array_pointers)[26];
mat = array_pointers;

编译会出现此错误:cannot convert 'int (*)[26]' to 'int (*)[]' in assignment

有人可以向我解释为什么这是一个错误或为什么它应该是一个错误?

2 个答案:

答案 0 :(得分:2)

在C中,int (* mat)[];是指向int数组的指针,其大小未指定(不是指针数组)。在C ++中,这是一个错误,在C ++中不能省略维度。

你的问题是new int *[K]所以我认为这确实是一个C ++问题。表达式new T[n]已经评估为T *,没有隐式转换。

使用new分配空指针数组的代码是:

int **mat = new int *[10]();

然后mat指向其中的第一个。另一种选择(不太常用)是:

int * (*mat)[10] = new int *[1][10]();

其中*mat指定整个10个指针数组。

NB。除了演示目的之外,这种代码对任何事情都没有用,无论你想做什么都有更好的解决方案。

答案 1 :(得分:0)

在C和C ++中,在某些情况下,数组和指针是可交叉的。 int*[]衰为int**

要动态分配数组,请使用:

int* mat;
// ...
mat = new int[size];
// ...
delete[] mat;

请注意,delete需要new所有内存,否则您将泄漏内存。 这并不容易。

C ++有一个名为RAII的东西可以提供帮助。 要使用RAII(意味着范围结束时将释放范围内的所有资源),请将new放在类构造函数中,并将delete放在析构函数中。

STL有一些可供您使用的集合器。 查看std::vector

如果你想要一个指针数组而不是动态数组,那么语法更像是

int** arr = new int[size];
arr[i] = &val;
// ...
delete[] arr;

不要忘记初始化数组中的每个指针!

如果在编译时知道size,则可以将其重写为:

std::array<int*, size> arr;
arr[i] = &val;

无需删除,并检查溢出。

如果在编译时size未知,您可以执行以下操作:

std::vector<int*> arr;
arr.resize(size);
arr[i] = &val;