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. 爲什麼Comparator.compare需要兩個參數?
- 2. 爲什麼我們需要calloc(或malloc)?
- 3. 爲什麼operator []只有一個參數?
- 4. 爲什麼一個參數ocaml的功能有兩個參數
- 5. 只需一個參數,兩個給定
- 6. 爲什麼php memcache連接函數只需要2個參數
- 7. 爲什麼apply()這裏只有一個參數而不是兩個?
- 8. 爲什麼我們需要一個具有兩個參數的Thread.sleep
- 9. random.choice()需要兩個參數?
- 10. 爲什麼要使用只有一個參數的string.Format?
- 11. 爲什麼'自我'需要成爲一個函數參數?
- 12. 爲什麼git push有時需要一個localref參數?
- 13. 我的Django視圖說它只需要一個參數,但只有一個參數,但只有一個
- 14. 爲什麼實體有時需要一個「url」參數,有時不需要?
- 15. TypeError:Connect()只需要一個參數
- 16. gdb只需要第一個參數
- 17. TypeError:count()只需要一個參數
- 18. 爲什麼IEqualityComparer <T> Equals方法需要兩個參數?
- 19. 爲什麼C++ 11 CAS操作需要兩個指針參數?
- 20. 爲什麼這個查詢需要一個參數?
- 21. 函數需要2個參數時,應只有一個
- 22. 爲什麼`fgets()`需要一個* str,但是`getline()`需要一個** str參數?
- 23. 爲什麼我的IBAction函數需要一個參數?
- 24. 爲什麼只有一些Tkinter回調函數需要參數,而另一些則不需要
- 25. calloc()函數,而不是malloc()
- 26. 爲什麼基類有一個需要0個參數的構造函數?
- 27. 爲什麼xml_http_request需要一個操作作爲其參數?
- 28. 爲什麼uploadTaskWithRequest:fromData:需要數據參數?
- 29. JavaScript去抖功能,爲什麼只有兩個參數?
- 30. GET()只需要2個參數(給出4個參數)
的豐富的歷史只是每天提醒由於一些程序員創建它的方式,並因此永遠留... – 2011-09-24 01:45:20
如果你不'不喜歡它,'#define calloc(x)(calloc)(x,1)'應該工作。 –
@Chris使用預處理器重新定義malloc或family似乎是一個非常糟糕的想法(除了可能用於調試內存分配)。 – ssube