2013-04-06 43 views
0

我正在讀一本書,在C malloc函數需要「塊」的內存要分配作爲參數的數量,決定了你投什麼的塊被多少字節基礎malloc返回的值。例如我的系統上的int是4個字節:因爲編譯器知道int爲4個字節çmalloc函數的大小參數

int *pointer; 

pointer = (int *)malloc(10); 

將撥出40個字節。

這讓我困惑的原因有兩個:

  1. 我讀了,大小參數實際上是要分配,並沒有涉及到任何類型的大小的字節數。

  2. 的malloc是返回地址的功能。它如何根據從void返回的地址的外部轉換調整其分配的內存的大小,以不同的類型?這只是我應該接受的一些編譯器魔法嗎?

我覺得這本書是錯的。任何幫助或澄清非常感謝!

下面是書上說的:

char *string; 
string = (char *)malloc(80); 

80套預留80塊存儲。塊大小是由類型轉換,(字符*),這意味着設置的malloc()被用於80個字符的查找存儲器。

+0

你正在閱讀哪本書,對於內存分配的工作方式有點古怪的看法? – 2013-04-06 04:22:59

+0

C多功能一體化桌面參考傻瓜...我喜歡傻瓜系列:) – 2013-04-06 04:26:46

+4

如果它出錯了,很難預測還有什麼不對。有時間來識別這本書(所以我們可以將它列入黑名單),然後去做一個更好的書。 _ [...時間passeth ...] _顯然,這是一個'For Dummies'的書;在這種情況下,也寫成'傻瓜'。將它強行扔出窗外或倒入垃圾,並獲得更好的東西。 '塊大小'是'一個字節'或'sizeof(char)';演員陣容不會影響通話的行爲。 – 2013-04-06 04:26:55

回答

8

是這本書是錯的,你是正確的,請扔掉那本書。
另外,不要讓大家知道這本書的名字,所以我們可以永久地把它放在我們從未建議黑名單。

良好閱讀:
What is the Best Practice for malloc?

+0

也可能他誤解了這本書在說什麼。 – 2013-04-06 04:18:19

+0

添加http://lysator.liu.se/c及其引用的所有內容。 – vonbrand 2013-04-08 00:18:23

6

當使用malloc(),使用sizeof操作符,並把它應用到該對象被分配,它不是那種

不是一個好主意:

int *pointer = malloc (10 * sizeof (int)); /* Wrong way */ 

更好的方法:

int *pointer = malloc (10 * sizeof *pointer); 

理由:如果你改變指針指向,你不需要更改malloc的數據類型()打電話。維護勝利。

此外,此方法是在代碼開發中不易出錯。您可以檢查它是正確的,而不必看看那裏的的malloc()調用變量聲明出現在分開的情況下聲明。

關於你有關鑄造malloc()的問題,請注意,對於在C中的malloc()進行強制轉換,現在有不需要。另外,如果數據類型應該在未來的版本改變,任何投也就不得不隨之改變或者是另一個誤差源。此外,請務必確保您已包含<stdlib.h>。通常人們通過投入來擺脫由於沒有包含文件而導致的警告。另一個原因是它在C++中是必需的,但通常不會編寫使用malloc()的C++代碼。

有關malloc()如何在內部工作的具體細節未在spec中定義,實際上它是一個帶有明確界面的黑盒子。要了解它在實現中的工作原理,您需要查看示例的開源實現。但是malloc()可以(並且確實)在各種平臺上變化很大。