2012-12-22 82 views
9

可能重複:
How to find the sizeof(a pointer pointing to an array)C,malloc()和數組長度

我正在學習如何創造下的動態數組,但所遇到的問題,我可以不知道。

如果我使用的代碼:

int num[10]; 
for (int i = 0; i < 10; i++) { 
    num[i] = i; 
} 
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0])); 

我得到的輸出:

sizeof num = 40 
sizeof num[0] = 4 

這是我所期待的事情發生。但是,如果我喜歡的malloc數組的大小:

int *num; 
num = malloc(10 * sizeof(int)); 
for (int i = 0; i < 10; i++) { 
    num[i] = i; 
} 
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0])); 

然後我得到的輸出:

sizeof num = 8 
sizeof num[0] = 4 

我很好奇,想知道爲什麼數組的大小爲40,當我使用固定長度方法,但不是當我使用malloc()時。

+0

'num'是第二種情況下指向int的指針,其大小取決於機器,即對於32位,它是4字節,對於64位,它是8字節。而在第一種情況下,num不是指針,它是'base數組的地址'sizeof()'給出數組的總大小。 。 – krpra

回答

16

在第二種情況下,num不是數組,是一個指針。 sizeof給你的指針的大小,這似乎是在你的平臺上的8個字節。

無法知道動態分配數組的大小,您必須將其保存在其他地方。 sizeof查看類型,但無法以任何方式從malloc的結果中獲得完整的數組類型(具有指定大小的數組類型,類型爲int[5]),並且sizeof參數不能應用於不完整類型如int[]

+0

你知道'free'函數是如何工作的,編譯器或O/S保存堆分配塊的記錄/跟蹤,然後只用提供指針就可以釋放,不需要'num'的數量,那麼爲什麼編譯器廠商可以提供一個功能讓用戶從堆記錄中檢索這個'num'? 因爲它已經在那裏......每當用戶調用'免費(ptr)' –

+0

@BuddhikaChaturanga對不起,我不確定自己的理解是否正確:你問爲什麼不實現公開有關堆分配的內存塊的細節?喜歡,給一個指針獲取信息? – effeffe

+0

是啊...如果他們已經有了關於動態分配數據的信息,如果他們使用它作爲'free',那他們爲什麼不能向用戶(Developers)提供功能以獲得這樣的信息...... :) –

2

第二個大小是指指針的大小,即在您的機器中 - 可能是64位 - 是8個字節。

您不能使用sizeof()來恢復動態分配結構的大小,但是您可以爲靜態分配的結構執行此操作。

4

數組不是指針(在某些情況下指針衰減,不在這裏)。

第一個是一個數組 - 所以sizeof爲您提供了數組的大小= 40個字節。

第二個是指針(不管它指向多少個元素) - sizeof給你sizeof(int*)

0

如果你想知道你分配的東西的大小,那麼你需要自己「記住」,因爲你的代碼做了分配。如果你的代碼沒有完成分配,那麼就沒有辦法[在標準意義上]找出指針指向的內存有多大。你只需要「知道」一些其他的方式。