如果我想为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
。
有人可以向我解释为什么这是一个错误或为什么它应该是一个错误?
答案 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;