2017-03-05 299 views
0

我感到困惑如何分配指針的「2D陣列」。C++ 2D指針數組

有了一些嘗試我已成功地分配東西,這似乎是工作,但我不知道爲什麼,這樣的解釋將是巨大的。

這是我的全部代碼:

#include <iostream> 


using namespace std; 


int main() { 


int *** ptr = (int ***)malloc(sizeof(int)* 100*100); 
for (int i = 0; i < 100; ++i) 
{ 
    ptr[i] = (int**)malloc(sizeof(int) * 100); 
    for (int j = 0; j < 100; ++j) 
     ptr[i][j] = (int*)malloc(sizeof(int) * 100); 
} 


cout << *ptr[20][20] << endl; 
cout << *ptr[99][20] << endl; 


} 

好,他們打印出的「垃圾值」,但它似乎不像我曾嘗試其他的東西好。
所以,如果我不misteaken這應該是等同於數組[100] [100]。

我questin就是爲什麼每個指針的「級別」必須有大小。

在這一行:

for (int j = 0; j < 100; ++j) 
     ptr[i][j] = (int*)malloc(sizeof(int) * 100); 
} 

它看起來對我來說,我們正在每個二維數組的協調(我知道這是不是因爲二維數組一樣)可以容納100個整數的大小,我只想保存一個整數。

,但如果我刪除它像這樣

for (int j = 0; j < 100; ++j) 
     ptr[i][j] = (int*)malloc(sizeof(int)); 
} 

然後我的程序停止工作。爲什麼?

+1

你爲什麼要使用malloc在C++程序?爲什麼你只是不使用矢量? –

+0

因爲我來自Java,我聽說的第一件事是malloc。這不好嗎? – gilley

+0

「這不好嗎?」是的,如果你來自Java,你可能也聽說過'new'。您可能還想了解C++和Java差不多完全不同的語言,爲了學習C++,您需要一本好的教科書。 –

回答

1
ptr[i] = (int**)malloc(sizeof(int) * 100); 

ptr[i]指向具有空間100個int對象的存儲器塊。但是,您的程序會嘗試將100個int**對象塞入該內存塊中。如果sizeof(int**) > sizeof(int)它可能是,那麼你溢出分配的內存。行爲是未定義的。

,另一方面sizeof(int)* 100*100可能比需要100個int***對象的一種方式了。


C++引入了一個稱爲new表達式的特性,它隱式地爲您計算分配對象或對象數組所需的內存。使用它們來避免這樣的錯誤。他們已經(幾乎)在C++中廢棄了malloc

+0

你可能會告訴我適當的方式來做到這一點?基本上我想數組[100] [100],但與指針。謝謝。 – gilley

+0

@gilley這是一個二維數組指針:'int * array [100] [100]' – user2079303

+0

@ user2079303是的,但它是固定的大小,我需要它可以調整一些其他參數的大小。 – gilley

0

我一直在使用的載體是我的問題,最好的解決辦法接受,但以防萬一有人需要這個在未來,這就是我想做的事:

int *** p2 = (int ***)malloc(sizeof(int **)* 100); 
for (int i = 0; i < 100; i++) 
p2[i] = (int **)malloc(sizeof(int *)* 100); 


for (int i = 0; i < 100; i++) { 
    for (int j = 0; j < 100; j++) { 
     p2[i][j] = (int *)malloc(sizeof(int)); 

    } 
}