2013-01-16 50 views
1

我是一個C++新手。在學習過程中遇到了這個問題。用new()初始化一個int [] []

,如果我有這樣的

指針

int (*a)[2][3]

cdecl.org將此描述爲declare a as pointer to array 2 of array 3 of int:

當我嘗試

int x[2][3];

a = &x;

這個工程。

我的問題是新的()這樣說

a = new int [] [];

我嘗試了一些組合,但是並沒有得到完全正確使用時,我如何初始化a

任何幫助將不勝感激。

回答

3

這可能不是問題的答案你」重新尋找,但你需要什麼 是一個新的表達式,其返回類型是(*)[2][3]這個 是相當簡單的;例如,這是返回類型new int [n][2][3]。這樣做,a將指向 [3] int數組的[2]數組的第一個元素。總之,三維數組。

問題是new不返回指向頂級 級別數組類型的指針;它會返回一個指向數組第一個元素的指針 。所以,如果你new int[2][3],表達式 分配 2陣列3 INT的陣列,但它返回 指針3 INT(int (*a)[3])的陣列,因爲在C++, 陣列被破壞(對於C的原因兼容性)。沒有辦法強迫它做其他事情。所以如果你想讓 返回一個指向二維數組的指針,你必須 分配一個三維數組。 (第一個維度可以是 1,因此new [1][2][3]會有所斬獲,並且實際上只有 分配了單個[2][3]。)

一個更好的解決方案可能是包裹在陣列中一個struct

struct Array 
{ 
    int data[2][3]; 
}; 

然後可以使用new Array,一切都按預期工作。 除了訪問數組所需的語法將不同於 。

+0

您可能會重載操作數組所需的'[]'運算符和類似運算符,然後保留語法。我不確定這是OP想要達到的目標,但至少可以解決單個內存分配問題。 +1從我 –

+0

@詹姆斯Kanze:這有助於很多。謝謝。選擇作爲答案:) – NeonGlow

+0

@IvayloStrandjev好點。你甚至可以重載一個轉換操作符,以獲得數組到指針的自動轉換。 (換句話說,模擬標準數組被破壞的方式。) –

5

你必須分兩步做 - 首先分配一個指向指針的數組(指向動態分配的數組),然後依次分配它們中的每一個。總體而言,我相信一個更好的選擇只是使用std::vector - 這是做這種事情的首選方式。

還在這裏是如何實現你想要的一個例子:

int a**; 
a = new int*[2]; 
for (int i =0; i< 2;++i){ 
    a[i] = new int[3] 
} 

... use them ... 
// Don't forget to free the memory! 
for (int i = 0; i< 2; ++i) { 
    delete [] a[i]; 
} 

delete [] a; 

編輯:和默認的要求 - 矢量版本:

std::vector<std::vector<int> > a(2, std::vector<int>(3,0)); 

// Use a and C++ will take care to free the memory. 
+0

如果你用'vector'代替它會是什麼樣子? – Default

+0

所以我假設不能有一個像'a = new int [] [];' – NeonGlow

+2

這樣的陳述完全不正確。 'int [2] [3]'是一塊內存。 –

相關問題