簡體   English   中英

在C中是malloc(256)和malloc(sizeof(char)* 256)等價嗎?

[英]In C are malloc(256) and malloc(sizeof(char)*256) equivalent?

我看到人們經常編寫C代碼,例如:

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

這真的有必要嗎? 根據定義,標准說sizeof(char)==1 ,所以寫入是不合理的:

char *ptr = malloc(256);

是的,C將sizeof(char)定義為1,始終(並且C ++也是如此)。

盡管如此,作為一般規則,我建議如下:

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

這樣,當你的老板說出類似的話:“哦,順便說一句,我們剛收到一份來自中國的訂單,所以我們需要盡快處理所有三個中文字母”,你可以把它改成:

wchar_t *ptr // ...

其余的可以保持不變。 鑒於你將有大約1000萬頭痛試圖在合理地處理i18n,甚至消除一些是值得的。 當然,這假設通常的情況是你的char真的打算保存字符 - 如果它只是某種原始緩沖區,你真的想要256字節的存儲空間,無論有多少(少數)字符可能是,你應該堅持使用malloc(256)並完成它。

這個問題甚至不應該存在。 你應該采用一種更為優雅的寫作你的malloc的習語

ptr = malloc(N * sizeof *ptr)

即盡量避免提及類型名稱。 類型名稱用於聲明,而不用於語句。

這樣你的malloc將始終與類型無關並且看起來是一致的。 乘以1是多余的這一事實將不那么明顯(因為有些人發現乘以sizeof(char)令人煩惱)。

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

這可能是真的,但只有char特定情況才適用。

我個人認為使用malloc(sizeof(char) * 256)表單是一種很好的形式,因為有人改變了類型,或者為了類似目的而復制代碼的類型可能會錯過這種情況的細微之處。

雖然編寫sizeof(char)在技​​術上沒有任何問題,但這樣做表明作者不熟悉C以及sizeof(char)定義為1的事實。在我工作的一些項目中,我們實際上是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以匹配字符串時,這尤其重要。

是的,它們在技術上是等同的。 這只是一種風格問題 - 使用sizeof進行每次分配都會讓你在真正需要它時不太可能錯過它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM