IMO一個就夠了,爲什麼calloc
要求將它分成兩個參數?爲什麼calloc需要兩個參數,而malloc只有一個參數?
回答
參數名稱記錄它相當好:
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。
兩個參數的另一個好處是可能會進行溢出檢查,通常很難(並且很少完成)'malloc'(儘管如果分配的是大小可能會溢出你可能會做錯了)。 –
@Chris:也許我們需要一個'cccalloc',它需要6個參數,並且在所有子表達式上用溢出檢查分配'a * b + c * d + e * f'字節... ;-) –
我不認爲這是對這個問題的回答。這不會問這些工作如何(那麼它將只是一個重複的,應該被關閉)。它要求將參數分成兩部分的理由,而不是'malloc'的總大小。 –
我想這可能是歷史,並早於C爲函數創建原型的時代。在沒有原型的這些時候,論據基本上必須是int
,typedef
size_t
可能還沒有發明。但INTMAX
是您可以分配的最大塊,並且可以分配兩塊,這隻會給您更多的靈活性,並允許您分配真正大的數組。即使在那個時候,也有一些方法可以從系統中獲取大型頁面,默認情況下已將其歸零,因此calloc
與malloc
之間的效率差別不大。
如今,隨着size_t
和手頭的函數原型,這是C.
- 1. 爲什麼operator []只有一個參數?
- 2. 爲什麼一個參數ocaml的功能有兩個參數
- 3. 只需一個參數,兩個給定
- 4. 爲什麼php memcache連接函數只需要2個參數
- 5. random.choice()需要兩個參數?
- 6. 爲什麼要使用只有一個參數的string.Format?
- 7. 爲什麼'自我'需要成爲一個函數參數?
- 8. 爲什麼git push有時需要一個localref參數?
- 9. gdb只需要第一個參數
- 10. TypeError:count()只需要一個參數
- 11. 函數需要2個參數時,應只有一個
- 12. 爲什麼IEqualityComparer <T> Equals方法需要兩個參數?
- 13. 爲什麼這個查詢需要一個參數?
- 14. 爲什麼我的IBAction函數需要一個參數?
- 15. 爲什麼只有一些Tkinter回調函數需要參數,而另一些則不需要
- 16. calloc()函數,而不是malloc()
- 17. 爲什麼基類有一個需要0個參數的構造函數?
- 18. JavaScript去抖功能,爲什麼只有兩個參數?
- 19. TypeError:__init __()只需要3個參數(給出2個參數)
- 20. TypeError:__init __()只需要1個參數(給出3個參數)pyXML
- 21. TypeError:只需要1個參數(給出2個參數)
- 22. Laravel FileManager iconv()只需要3個參數,給定4個參數?
- 23. 當我僅聲明一個選項參數時,爲什麼需要提供兩個選項參數?
- 24. 爲什麼Convert.ChangeType需要一個對象參數?
- 25. 爲什麼繪製XNA()需要一個色彩參數
- 26. 爲什麼np.ndarray .__ deepcopy__需要一個多餘的參數?
- 27. C# - 爲什麼我需要初始化一個[out]參數
- 28. 爲什麼Clojure會認爲它應該只有一個參數?
- 29. CMBufferQueueCreate需要什麼參數?
- 30. 爲什麼POST獲取兩個參數?
的豐富的歷史只是每天提醒由於一些程序員創建它的方式,並因此永遠留... – 2011-09-24 01:45:20
如果你不'不喜歡它,'#define calloc(x)(calloc)(x,1)'應該工作。 –
@Chris使用預處理器重新定義malloc或family似乎是一個非常糟糕的想法(除了可能用於調試內存分配)。 – ssube