2014-02-14 38 views
1

我得到了在實驗室這塊示例代碼和我嘗試去了解它理解的malloc

int size = 5; 
int **ppi2 = (int **) malloc(size * sizeof(int *)); 

這裏是我對它的擊穿截至目前:

爲了分配足夠的內存,我們必須將我們想要爲(size)分配內存的東西的數量乘以這些東西的大小(sizeof(int *))。這很簡單,很有意義。

我明白我們必須將malloc的結果轉換爲雙指針,因爲malloc返回字節並且該變量是雙指針,但爲什麼我們將ppi2設置爲等於malloc的結果呢?它是否會使ppi2指向我們剛剛分配的內存中的位置?

+2

首先,[不要強制轉換'malloc']的結果(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。 – pzaenger

+0

我在C編程,所以我認爲我應該投它 –

+0

你需要將結果轉換爲'C++'而不是'C'。只需閱讀提供的鏈接中接受的答案即可。 – pzaenger

回答

0

我明白,我們必須對malloc的結果轉換成一個雙指針,因爲的malloc返回字節變量是一個雙指針...

Do not cast the return value of malloc

爲什麼我們將ppi2設置爲等於malloc的結果呢?

指向相同的位置通過由malloc指針返回。

是否讓ppi2指向我們剛分配的內存中的位置?

是的。

0

我明白,我們必須對malloc的結果轉換成一個雙指針,因爲的malloc返回字節變量是一個雙指針,

malloc不返回字節;它返回一個指向它分配的字節的指針。該指針有一個通用指針類型void *。在C++中,您必須將此void *重新放回到變量的指針類型中,但在普通C中,此類型是可選的。

但是爲什麼我們將ppi2設置爲等於malloc的結果呢?它是否會使ppi2指向我們剛剛分配的內存中的位置?

是的。

+0

在C++中,通常最好使用'new'而不是'malloc' - 或者更好的方法是使用其中一個標準容器類。 –

+0

@KeithThompson可憐的「分配器」,沒有人不會記得他們:D。 「真正的」C++分配/釋放內存的方式。 – user2485710

1

使用malloc,您將參數傳遞給要分配的內存字節數,並將地址返回到您剛剛分配的內存的開始處。將該地址存儲在一個指針中,然後可以執行必要的操作。它不會返回內存的字節,它會返回地址,然後您可以繼續操作它們。這就是C內存管理很重要的原因(你不知何故失去了這個地址,你「失去了」內存)。

如果你想更好地瞭解如何malloc與記憶及其與你的程序(因爲它的基本知識,我建議)關係的作品,閱讀Three Easy Pieces手術系統的書Chapter 13。它很短,很棒。