2015-02-11 272 views
0
char *c = (char *)malloc(30*sizeof(char)); 
printf("%lu \n",sizeof(c)); 

在上面的代碼中,我試圖打印'c'的大小。無論代碼中給出的數字是「30」而不是「30」,我都將sizeof(c)設爲8.爲什麼我總是8?

問題是什麼?我怎樣才能確定一個數組的大小?

數組的長度和大小是否相同?

+4

'sizeof(c)'是一個編譯時常量,不是運行時計算的值。 – 2015-02-11 12:42:38

+1

注意:你應該爲'size_t'(這是'sizeof()'返回的類型)使用'「%zu」'而不是''%lu'''。你的代碼是64位Windows和少數POSIX系統的UB(因爲'size_t'是64位,而'long unsigned int'是32位)。 – 2015-02-11 12:50:03

+3

[請不要在C]中拋出'malloc()'的返回值(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。 – unwind 2015-02-11 12:53:46

回答

8

目前,您正在詢問64位機器上的指針大小是8個字節。由於這是malloc而不是真實數組,因此無法檢索通過c分配的緩衝區的大小。

如果c被宣佈爲

char c[30]; 

你可以決定大小與

size_t size = sizeof(c)/sizeof(c[0]) 

但說實話,如果我必須這樣做,我只想#define數組的大小,即使大小計算將在編譯時被刪除。它使我認爲代碼更清晰。

0

sizeof是一個運算符,而不是一個函數,因此編譯器創建的代碼等價於類似於sizeof(char *)之類的代碼,並且char的指針(取決於當然的體系結構)是8個字節。

0

實際上,sizeof(* c)將返回1. mallocced緩衝區的大小無法確定編譯時間(這是sizeof的大小)。

2

您正在打印的系統中的(char *)的大小爲8. 如果您想知道後者,「malloc」ed的內存量必須存儲在某處。在你的情況下,如果你需要它,你應該存儲'30'以備將來使用。

0

您正在獲取變量c的大小,而不是它指向的內存區域的大小。沒有辦法獲得函數內任何數組/結構對象的大小,因爲它總是衰減到指針。您必須自己保存尺寸。如果您已將尺寸傳遞給malloc,那麼爲什麼不能將該尺寸存儲到變量中?

1

sizeof(c)表示給我變量c的大小。由於c是一個指針,它可以讓你回到指針在內存中佔用的字節數。你看到的事實8表明你正在編譯64位。在32位內置它將是4.

這是你的工作,要記住你分配的東西的大小。畢竟,你需要大量的記憶,所以你知道你分配了多少!在你的情況下,size_t size = 30*sizeof(char)會給你你分配的金額。

+0

@CoolGuy - 謝謝,我的錯字。 – Sean 2015-02-11 13:05:38

+0

另外,實際分配的內存可能更大,所以即使有'memlen'這樣的函數,它也幾乎沒用。例如,爲了對齊目的,它可能會達到某個「N」的倍數。當然,你不應該依賴代碼中的內容(如果你需要更多的字節,可以要求更多的字節!)。 – 2015-02-11 13:07:29

相關問題