2012-03-19 80 views
0

我想在下面的代码中创建一个三维数组,但我得到运行时错误。如何创建一个三维动态数组

int dim1,dim2,dim3; 
std::cout<<"dim one\n"; 
std::cin>>dim1; 
std::cout<<"dim two\n"; 
std::cin>>dim2; 
std::cout<<"dim three\n"; 
std::cin>>dim3; 

int ***three_dim=0; 
three_dim=new int**[dim1]; 
for(int i=0;i<dim1;++i) 
    three_dim[i]=new int*[dim2]; 

for(int k=0;k<dim2;++k) 
    three_dim[k]=new int*[dim3]; 
for(int k=0;k<dim1;++k) 
for(int i=0;i<dim2;++i) 
    for(int j=0;j<dim3;++j) 
     three_dim[k][i][j]=0; 

编辑:

它是我使用三维阵列必须的。我创建了一个具有相同样式的二维数组,并且希望将其扩展为三个,因为这是我所需要的。但正如你所看到的,我感到困惑。

谢谢博佩尔松

+0

a)在一个类中包装一维数组,并自己做索引 - 数学运算b)使用int向量的向量向量c)使用boost :: multi_array。只是不要做你现在正在做的事情。 – jrok 2012-03-19 17:28:31

+1

任何时候你写'***',这不是一个评论,警钟应该在你脑海中消失。 – 2012-03-19 17:31:19

+0

是的,[三星程序员](http://c2.com/cgi/wiki?ThreeStarProgrammer) – 2012-03-19 17:34:41

回答

2

这部分

for(int k=0;k<dim2;++k) 
    three_dim[k]=new int*[dim3]; 

有两个问题。一种是分配int*而不是int。另一个更严重的问题是,它会覆盖以上分配的指针。

你或许应该做的分配是这样的:

for(int i=0;i<dim1;++i) 
{ 
    three_dim[i]=new int*[dim2]; 

    for(int k=0;k<dim2;++k) 
     three_dim[i][k]=new int[dim3]; 
} 
1

做这种事情的指针方式还是会在最后。

如果你确实需要一个三维数组,那么一个简单的方法就是使用嵌套的STL容器。即std::vector<std::vector<std::vector<int>>>>

确保您解决了正确的问题。我并不是说你不是,但我只是觉得你可以在没有三维数组的情况下解决这个问题,尤其是如果你对指针不太熟悉的话,尤其如此。