2012-05-22 108 views
2

可能重複:
c difference between malloc and calloc
why malloc+memset slower than calloc?calloc和malloc跟memset有什麼區別?

什麼是後跟一個memset的釋放calloc & malloc的區別?如果我用malloc和memset替換calloc中的所有調用,它會一樣嗎?

如果是這樣的話,爲什麼calloc單獨提供了兩個函數malloc &?

+4

http://stackoverflow.com/questions/2688466/why-mallocmemset-slower-than-calloc – cnicutar

+1

有在互聯網很多很多的答案,在這裏 – theWalker

+0

參考http://stackoverflow.com/questions/2605476/calloc -vs-malloc-and-time-efficiency和http://stackoverflow.com/questions/1538420/c-difference-between-malloc-and-calloc – verisimilitude

回答

12

雖然calloc()始終使用零初始化存儲區('\0'),但memset()調用允許您選擇用哪些字節填充內存。

在速度方面,如果內存需要清零,calloc()可能會比malloc() + memset()更快; malloc()可以更快地返回未初始化的內存,但仍需要額外撥打memset()

基本上,如果要將內存清零,請使用calloc();如果您想讓它初始化,請使用malloc()

+0

+1現在得到它:) – verisimilitude

+0

你絕對是r8 :) – Addicted

3

一個重要的區別是,如果nmemb * size溢出,我期望calloc(nmemb, size)返回NULL。如果您改爲使用malloc(nmemb * size),乘法溢出會導致您請求比您預期的更小的緩衝區(這可能會導致稍後的安全問題)。因此,如果您打算用malloc替換calloc來電,那麼需要注意一些問題。

+0

「與malloc,你最終會要求更小的緩衝區比你預期的」 - 這怎麼可能?如果malloc不能提供請求的字節數,將不會失敗嗎?如果你能更詳細地闡明它,那將會很棒。 – Jay

+1

@Jay:是的,如果malloc不能提供請求的字節數,它將會失敗。這裏的問題是如果你不檢查乘法溢出,* request *本身可能是錯誤的。 – jamesdlin

+0

@jamesdlin不在標準中,所以我希望你能檢查一下自己;-) –