2010-02-14 70 views
11

可能重複:
newbie questions about malloc and sizeof使用的sizeof()的malloc分配內存

我想讀的字符串到一個程序。當我注意到弦有時被損壞,我嘗試下面的代碼:

void *mallocated = malloc(100); 
printf("sizeof(mallocated) = %d\n", sizeof(mallocated)); 

根據我的方案,mallocated尺寸爲8,即使我被分配100個字節它。因此,每當我嘗試存儲超過8個字節的字符串時,第8個字節後的所有內容都會消失。爲什麼會發生這種情況,我該如何預防它?

+4

sizeof(mallocated)會給你void *的大小,在你的64位系統上是8個字節。你如何使用strcpy爲該變量分配一個字符串? – tur1ng

+0

參見:http://stackoverflow.com/questions/1533519/newbie-questions-about-malloc-and-sizeof – Shog9

+0

你的結論也是錯誤的,任何寫在第8個「字節」(不是位)之後的東西都不會隨機消失有時。 – Blindy

回答

13

因爲「字符串」指針的大小是8個字節。這裏有一些使用sizeof()和相應的「size」的例子。術語size_of()有時候會對不習慣使用它的人造成欺騙。在你的情況下,指針的大小是8個字節..下面是一個典型的32位系統的表示。

sizeof (char) = 1 
sizeof (double) = 8 
sizeof (float) = 4 
sizeof (int) = 4 
sizeof (long) = 4 
sizeof (long long) = 8 
sizeof (short) = 2 
sizeof (void *) = 4 

sizeof (clock_t) = 4 
sizeof (pid_t) = 4 
sizeof (size_t) = 4 
sizeof (ssize_t) = 4 
sizeof (time_t) = 4 

Source

你離開了你是如何判斷你的字符串消失(字符數組)。它可能被傳遞給一個函數,您需要將顯式長度作爲變量傳遞或在某處追蹤。使用sizeof()不會告訴你這一點。

看到我的previous question關於這個,你會看到,即使我缺乏初步的瞭解。

+0

感謝您的幫助。該計劃的問題不是我認爲的那樣(是否曾經?),但您的建議非常有用。 –

7

在C89,sizeof操作者僅發現的可變在編譯時間字節大小(在這種情況下void指針的8個字節)。它的工作方式與你期望在普通數組上工作的方式相同,因爲它們的大小在編譯時已知。

char arr[100]; // sizeof arr == 100 
char *p = arr; // sizeof p == 4 (or 8 on 64-bit architectures) 
char *p = malloc(100); // sizeof p == 4 (or 8). Still! 

要知道堆分配內存的大小,你需要手動跟蹤它,sizeof不會幫你。

+1

這是不正確的。在C99中,'sizeof'返回可變長度數組的大小,在很多情況下只能在運行時確定。 – dreamlax

+0

謝謝,我從答案中排除了C99情況,以使事情更簡單。 –

7

sizeof返回您指定的指針的大小(void *),而不是您分配的內存大小。如果您想稍後使用,則必須將內存大小存儲在單獨的變量中。

3

你不能。正如指出的那樣,你可以獲得void * mallocated的大小,但這並不能說明你的問題。

不能得到malloed *mallocated的大小。也就是說,沒有函數調用返回100(在你的例子中) - 除非你編寫自己的內存管理例程。

最簡單的就是要記住它的地方......也許....

stuct { 
    void *data; 
    unsigned int size 
} myStructureWhichRemebersItsSize; 

myStructureWhichRemebersItsSize *someData; 
someData.data = malloc(100); // and check for NULL 
someData.size = 100; 
+1

「你無法獲得malloed的大小......」不是這樣,它取決於你的C庫。在MS的CRT STDLIB下,你可以簡單地調用'_msize(* mallocated)'來獲得OP尋找的「100」。 –

+0

+1感謝您的信息。我不使用MS,所以不知道。一個有用的功能,很適合在更多地方看到。當然,在幕後,編譯器可能會生成一個像我描述的結構。 – Mawg

0

void*是在內存中的位置的類型,如果你不知道它包含什麼。應該避免。

char*是指向內存中某個位置的值的類型,該位置包含char。識別內存中的位置需要8個字節。

sizeof告訴你一個特定類型需要多少個字節。沒有多少被分配到malloc,但是多少內存編譯器知道應該是。將sizeof應用於值通常被認爲是不好的風格,正如其他人在此提到的,有時會在C99中調用智能行爲。

char[100]保存100個字符的值的類型。 char[100] a;是堆棧中的一個100 char s的字符串。

char(*)[100]是指向保存100個字符的值的指針的類型。 char(*b)[100];使得b指向100個字符,可能在堆上。你可能想要的是

char (*s)[100] = malloc(sizeof(char[100])); 
printf("%u byte pointer to %u bytes of size %u elements\n", 
    sizeof s, sizeof *s, sizeof **s);