2012-04-20 163 views
3

我對動態分配3D數組有點困惑。現在,我只是分配一個內存大塊像這樣:動態分配3D數組

int height = 10; 
int depth = 20; 
int width = 5; 

int* arr; 
arr = new int[height * width * depth]; 

現在,我想的三維陣列中更改值,說:

//arr[depth][width][height] 
arr[6][3][7] = 4; 

不過,我可以不使用上面的代碼來更改值。如何使用單個索引訪問位置深度= 6,寬度= 3,高度= 7的元素?

arr[?] = 4; 

有沒有更好的方法來動態分配3D數組?

+0

這是我認爲的指針,如果你需要3個維度,那麼不應該是int *** arr = new int [height] [width] [depth]; ? – 2012-04-20 00:34:30

回答

6

索引到扁平3維陣列:

arr[x + width * (y + depth * z)] 

其中,x,y和z分別對應於第一,第二和第三寬度和深度分別是陣列的寬度和深度。

這是x + y * WIDTH + z * WIDTH * DEPTH的簡化。

+0

對不起,x對應於width元素,y是高度元素,z是深度元素,還是我有錯?因此,要得到深度= 6,寬度= 3,高度= 7的元素:arr [3 + 5 *(7 + 20 * 6)] = arr [638]? – user974967 2012-04-20 01:50:46

+0

@ user974967:「x是高度」,「y是寬度」,「z是深度」。要訪問'arr [6] [3] [7]'使用'arr [6 + 5 *(3 + 20 * 7)]''。基本上,高度,寬度,然後在這個順序的深度。 – 2012-04-20 02:02:00

7

Ç這樣做的傾斜的方法是:

int ***arr = new int**[X]; 
for (i = 0; i < z_size; ++i) { 
    arr[i] = new int*[Y]; 
    for (j = 0; j < WIDTH; ++j) 
    arr[i][j] = new int[Z]; 
} 
3

具有簡單的分度機構等ARR [高度] [寬度] [深度],並且還具有在所分配的存儲器的默認值被初始化爲0,請嘗試以下方法:

// Dynamically allocate a 3D array 
/* Note the parenthesis at end of new. These cause the allocated memory's 
    value to be set to zero a la calloc (value-initialize). */ 
    arr = new int **[height](); 
    for (i = 0; i < height; i++) 
    { 
     arr[i] = new int *[width](); 
     for (j = 0; j < width; j++) 
      arr[i][j] = new int [depth](); 
    } 

而這裏的相應的釋放:

//Dynamically deallocate a 3D array 

for (i = 0; i < rows; i++) 
{ 
    for (j = 0; j < columns; j++) 
     delete[] arr[i][j]; 
    delete[] arr[i]; 
} 
delete[] arr; 
1

分配和解除分配用於3D陣列(在堆)是完全彼此相對。在正確釋放內存的同時,要記住的關鍵是使用delete關鍵字的次數與使用關鍵字new的次數相同。 這裏是我的初始化代碼和清理以3D陣列的:

int ***ptr3D=NULL; 
ptr3D=new int**[5]; 

for(int i=0;i<5;i++) 
{ 
    ptr3D[i] = new int*[5]; 

    for(int j=0;j<5;j++) 
    { 
     ptr3D[i][j]=new int[5]; 

     for(int k=0;k<5;k++) 
     { 
      ptr3D[i][j][k]=i+j+k; 
     } 
    } 
} 
//Initialization ends here 
... 
... //Allocation of values 

cout << endl <<"Clean up starts here " << endl; 

for(int i=0;i<5;i++) 
{ 
    for(int j=0;j<5;j++) 
    { 
     delete[] ptr3D[i][j]; 
    } 
    delete[] ptr3D[i]; 
} 
delete ptr3D; 

注意3個new關鍵字,3對應delete關鍵字已被使用。 這應該清理分配給堆中3D數組的所有內存,並且可以使用Valgrind在每個階段驗證它。