2010-07-01 84 views
11

我看到,人們經常寫C代碼,如:在C中,malloc(256)和malloc(sizeof(char)* 256)是否相等?

char *ptr = malloc(sizeof(char)*256); 

是不是真的有必要嗎?該標準說sizeof(char)==1定義,因此不很有意義只是寫:

char *ptr = malloc(256); 

謝謝,博大Cydo。

+1

參見:http://stackoverflow.com/questions/2215445/are-there-machines-where-sizeofchar-1 – Saul 2010-07-01 22:13:34

+2

還值得注意的是sizeof()運算符是在編譯時計算的,所以沒有運行時性能打到使用sizeof()。 (除了在運行時指定數組長度的情況,但這不是您使用的示例。) – poundifdef 2010-07-01 22:24:27

+0

爲什麼不使用calloc? – luiscubal 2010-07-01 22:55:35

回答

21

是的,C定義sizeof(char)爲1,總是(和C++一樣好)。當你的老闆說像

char *ptr = malloc(256 * sizeof(*ptr)); 

這樣,:「哦,順便說一句,我們剛剛從中國的訂單,所以我們需要

然而,作爲一般規則,我建議像儘快處理所有三個中文字母「,您可以將其更改爲:

wchar_t *ptr // ... 

其餘可以保持不變。鑑於你將有大約1000萬令人頭疼的事情,試圖在合理的中途處理國際事務,甚至有一些事情是值得的。當然,假設你的char實際上是用來保存字符的 - 通常情況下,如果它只是某種原始緩衝區,並且你確實需要256字節的存儲空間,而不管有多少(少數)字符可能是,你應該堅持malloc(256)並完成它。

+0

這很聰明,我沒有知道sizeof(* type)按預期工作了 – poundifdef 2010-07-01 22:21:24

+2

@rascher:這裏沒有'sizeof(* type)''ptr'不是一個類型,它是一個指針變量 – AnT 2010-07-01 22:23:32

+1

@rascher:爲了澄清,你可以使用sizeof(type)或sizeof(expression)'在後一種情況下,編譯器推導出表達式的類型,但表達式本身是* not *求值的,所以它不需要包含有效值(例如,代碼似乎解引用null或uni硝化指針仍然很好)。 – 2010-07-01 22:28:27

4

它們是等價的,但保持一致是件好事。這也使得它更加明確,所以你明白你的意思。如果類型發生變化,則更容易找出需要更新的代碼。

1

是的,它們在技術上是等效的。這只是一個風格問題 - 使用sizeof爲每個分配使你不太可能錯過它,當你真的需要它。

4

這可能是對的,但只對char這個特定情況纔是正確的。

我個人認爲這是使用malloc(sizeof(char) * 256)表單的好方法,因爲有人更改類型或將代碼複製到類型不同的類似用途可能會漏掉這種情況的微妙之處。

+0

+1複製代碼時 – Cam 2010-07-01 22:14:56

+0

如果有人更改類型,sizeof(char)* 256'不會幫助你;你是指'sizeof * ptr * 256'? – 2010-07-01 22:16:33

+0

@Charles,同意,他們仍然必須改變聲明中的類型,但至少應該是明確的,而不是僅僅是一個數字 – 2010-07-01 22:18:57

6

問題不應該存在。你應該採取寫你malloc的更優雅的成語作爲

ptr = malloc(N * sizeof *ptr) 

即避免提及類型名稱儘可能。類型名稱用於聲明,不用於聲明。

這樣你的malloc將永遠是類型無關的,並且看起來一致。乘以1的事實是多餘的將不那麼明顯(因爲有些人發現乘以sizeof(char)惱人)。

2

雖然沒有什麼技術上的錯誤與寫作sizeof(char),這樣做表明,筆者不熟悉C和sizeof(char)被定義爲在一些項目我工作的事實,我們實際上用grep爲sizeof(char)實例作爲代碼可能是低質量的指示。

在另一方面,ptr = malloc(count * sizeof(*ptr));是一個非常有用的文檔和錯誤避稅成語,和很有意義,即使sizeof(*ptr)是1。然而,它需要由if (count > SIZE_MAX/sizeof(*ptr)) { /* handle overflow */ }前面,或者你有一個嚴重的錯誤。在將wchar_t的數組或與輸入字符串長度相同的複雜結構進行分配時,例如在將UTF-8字符串轉換爲wchar_t字符串或構建DFA以匹配字符串時,這可能尤其相關。

+0

值得注意的是,即使在char大於8位的系統上(我已經使用了16位的字符),sizeof(char)仍然是1;在這種情況下sizeof(int)也是一個。我甚至聽說過sizeof(long)也是一個的系統,因爲char是64位的。 – supercat 2010-08-13 15:46:21