char *c = (char *)malloc(30*sizeof(char));
printf("%lu \n",sizeof(c));
在上面的代碼中,我試圖打印'c'的大小。無論代碼中給出的數字是「30」而不是「30」,我都將sizeof(c)設爲8.爲什麼我總是8?
問題是什麼?我怎樣才能確定一個數組的大小?
數組的長度和大小是否相同?
char *c = (char *)malloc(30*sizeof(char));
printf("%lu \n",sizeof(c));
在上面的代碼中,我試圖打印'c'的大小。無論代碼中給出的數字是「30」而不是「30」,我都將sizeof(c)設爲8.爲什麼我總是8?
問題是什麼?我怎樣才能確定一個數組的大小?
數組的長度和大小是否相同?
目前,您正在詢問64位機器上的指針大小是8個字節。由於這是malloc
而不是真實數組,因此無法檢索通過c
分配的緩衝區的大小。
如果c
被宣佈爲
char c[30];
你可以決定大小與
size_t size = sizeof(c)/sizeof(c[0])
但說實話,如果我必須這樣做,我只想#define
數組的大小,即使大小計算將在編譯時被刪除。它使我認爲代碼更清晰。
sizeof
是一個運算符,而不是一個函數,因此編譯器創建的代碼等價於類似於sizeof(char *)
之類的代碼,並且char的指針(取決於當然的體系結構)是8個字節。
實際上,sizeof(* c)將返回1. mallocced緩衝區的大小無法確定編譯時間(這是sizeof的大小)。
您正在打印的系統中的(char *)的大小爲8. 如果您想知道後者,「malloc」ed的內存量必須存儲在某處。在你的情況下,如果你需要它,你應該存儲'30'以備將來使用。
您正在獲取變量c的大小,而不是它指向的內存區域的大小。沒有辦法獲得函數內任何數組/結構對象的大小,因爲它總是衰減到指針。您必須自己保存尺寸。如果您已將尺寸傳遞給malloc
,那麼爲什麼不能將該尺寸存儲到變量中?
sizeof(c)
表示給我變量c
的大小。由於c
是一個指針,它可以讓你回到指針在內存中佔用的字節數。你看到的事實8表明你正在編譯64位。在32位內置它將是4.
這是你的工作,要記住你分配的東西的大小。畢竟,你需要大量的記憶,所以你知道你分配了多少!在你的情況下,size_t size = 30*sizeof(char)
會給你你分配的金額。
@CoolGuy - 謝謝,我的錯字。 – Sean 2015-02-11 13:05:38
另外,實際分配的內存可能更大,所以即使有'memlen'這樣的函數,它也幾乎沒用。例如,爲了對齊目的,它可能會達到某個「N」的倍數。當然,你不應該依賴代碼中的內容(如果你需要更多的字節,可以要求更多的字節!)。 – 2015-02-11 13:07:29
'sizeof(c)'是一個編譯時常量,不是運行時計算的值。 – 2015-02-11 12:42:38
注意:你應該爲'size_t'(這是'sizeof()'返回的類型)使用'「%zu」'而不是''%lu'''。你的代碼是64位Windows和少數POSIX系統的UB(因爲'size_t'是64位,而'long unsigned int'是32位)。 – 2015-02-11 12:50:03
[請不要在C]中拋出'malloc()'的返回值(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。 – unwind 2015-02-11 12:53:46