在c ++中,我可以创建一个具有固定列数的2D数组,例如5,如下所示:
char (*c)[5];
然后我可以为行分配内存,如下所示
c = new char[n][5];
其中n可以是任何即使在运行时也可以赋值的变量。我想知道是否以及如何使用此方法为每行动态分配可变数量的内存。即我想使用第一个语句,但可以修改第二个语句。
答案 0 :(得分:4)
不是指向数组的指针,而是指向一个指针指针,用指针数组填充,每个指针的元素依次用一个字符数组填充:
char ** c = new char*[n]; // array of pointers, c points to first element
for (unsigned int i = 0; i != n; ++i)
c[i] = new char[get_size_of_array(i)]; // array of chars, c[i] points to 1st element
更多的C ++数据结构是std::vector<std::string>
。
正如您在评论中注意到的那样,使用new[]
分配的动态数组无法调整大小,因为C ++中没有realloc
的模拟(如果你对象模型没有意义)想一想)。因此,在动态生命周期管理的任何手动尝试中,您应该总是更喜欢合适的容器。
总结:不要使用new
。永远。使用适当的动态容器。
答案 1 :(得分:1)
您需要按如下方式声明c:char** c
;然后,按如下方式分配主要数组:c = new char*[n]
;然后,按如下方式分配每个次要数组:c[i] = new char[m]
答案 2 :(得分:0)
#include <iostream>
using namespace std;
main()
{
int row,col,i,j;
cout<<"Enter row and col\n";
cin>>row>>col;
int *a,(*p)[col]=new (int[row][col]);
for(i=0;i<row;i++)
for(j=0;j<col;j++)
p[i][j]=i+j;
for(i=0;i<row;i++)
for(j=0;j<col;j++)
cout<<i<<" "<<j<<" "<<p[i][j]<<endl;
//printf("%d %d %d\n",i,j,p[i][j]);
}