2011-09-24 120 views
8

IMO一個就夠了,爲什麼calloc要求將它分成兩個參數?爲什麼calloc需要兩個參數,而malloc只有一個參數?

+10

的豐富的歷史只是每天提醒由於一些程序員創建它的方式,並因此永遠留... – 2011-09-24 01:45:20

+1

如果你不'不喜歡它,'#define calloc(x)(calloc)(x,1)'應該工作。 –

+5

@Chris使用預處理器重新定義malloc或family似乎是一個非常糟糕的想法(除了可能用於調試內存分配)。 – ssube

回答

3

參數名稱記錄它相當好:

void *malloc(size_t size); 
void *calloc(size_t nelem, size_t elsize); 

後一種形式允許陣列整齊分配,通過提供的元件和元件尺寸的數量。乘以malloc可以實現相同的行爲。

但是,calloc也將分配的內存初始化爲0. malloc沒有初始化,所以該值未定義。在理論上,由於沒有設置所有的存儲器,因此可以更快地獲得malloc;這只是可能會被大量注意到。

this question中,建議calloc爲clear-alloc,malloc爲mem-alloc。

+4

兩個參數的另一個好處是可能會進行溢出檢查,通常很難(並且很少完成)'malloc'(儘管如果分配的是大小可能會溢出你可能會做錯了)。 –

+1

@Chris:也許我們需要一個'cccalloc',它需要6個參數,並且在所有子表達式上用溢出檢查分配'a * b + c * d + e * f'字節... ;-) –

+6

我不認爲這是對這個問題的回答。這不會問這些工作如何(那麼它將只是一個重複的,應該被關閉)。它要求將參數分成兩部分的理由,而不是'malloc'的總大小。 –

5

我想這可能是歷史,並早於C爲函數創建原型的時代。在沒有原型的這些時候,論據基本上必須是inttypedefsize_t可能還沒有發明。但INTMAX是您可以分配的最大塊,並且可以分配兩塊,這隻會給您更多的靈活性,並允許您分配真正大的數組。即使在那個時候,也有一些方法可以從系統中獲取大型頁面,默認情況下已將其歸零,因此callocmalloc之間的效率差別不大。

如今,隨着size_t和手頭的函數原型,這是C.

+0

這根本不回答問題。所使用的整數類型的寬度與此問題完全無關。 – Jeff

+0

@傑夫,你能解釋一下嗎?我並不是說今天使用的整數類型的寬度與它有什麼關係。我說的是,在創建界面的時候,這可能是一個問題。 –

+0

我反對這個建議,即「真正的大陣列」。使用兩個參數代替一個參數是糟糕的API設計。爲什麼有人希望'calloc'是一個指針,它們隨後不能「realloc」,或者它們不能使用,例如'memset'或'memcpy'?隨意在我的瑣事中感到惱火,但可以合理地說一下sizeof()返回無符號和分配數組的大小,這比'INT_MAX'略大。 – Jeff

相關問題