2015-11-11 58 views
3

據我所知,動態分配的二維數組應分配是這樣的:動態二維數組:int(* ptr)[4] = new int [7] [4];

int **rows = new int*[7]; 
//for loop assigning all seven rows[i] a "new int[4]" 

然而,下面還爲我的作品:

int (*ptr)[4] = new int[7][4]; //create dynamic 2d array 
for(int i = 0; i < 7; ++i)  //initialize and test 
{  
    for(int j = 0; j < 4; ++j) 
    { 
     ptr[i][j] = i + j; 
     cout << ptr[i][j] << ' '; 
    } 
    cout << endl; 
} 
delete[] ptr; 

/* 
output: 
0 1 2 3 
1 2 3 4 
2 3 4 5 
3 4 5 6 
4 5 6 7 
5 6 7 8 
6 7 8 9 
*/ 

我爲什麼要使用更復雜的方法我首先提到的,當我可以創建一個動態二維數組與這一行:

int (*ptr)[4] = new int[7][4]; 

我明白任何見解!

(我沒有使用的valgrind發現內存泄漏。)

+0

[相關常見問題](http://stackoverflow.com/questions/4810664/) – fredoverflow

回答

1

int (*rows)[4]要求4是一個編譯時間常數。如果直到運行時才知道列數,則不能使用此方法。

但是,您應該既不使用這些方法。爲了編寫安全的代碼,應該避免使用原始指針。通過使用適當的容器,內存管理將爲您完成,這意味着您的代碼很清晰,不太可能包含錯誤。

// Neither rows nor columns known at compile-time 
std::vector<std::vector<int>> x(7, std::vector<int>(4)); 

// columns known at compile-time 
std::vector<std::array<int, 4>> x(7); 

在這兩種情況下,您都可以通過x[5][2]等訪問元素。

4

爲什麼要使用我首先,當我可以創建與該一條線一個動態二維數組中提到更復雜的方法:

當列的行數在行中不同時,您將需要該值。假設你有一個2D數組,如下所示:

1 2 3 4 5 6 7 8 9 10 
1 2 3 4 
9 8 8 5 6 4 

對於這種情況,第二種方法將不起作用。您需要使用:

p[0] = new int[10]; 
p[1] = new int[4]; 
p[2] = new int[6];