2

重複の可能性: malloc とcalloc
の c の違い

memsetが続くcallocとmallocの違いは何ですか? calloc へのすべての呼び出しを malloc の後に memset に置き換えた場合、同じになりますか?

その場合、malloc と calloc の 2 つの関数が別々に提供されているのはなぜですか?

4

2 に答える 2

13

calloc()常にメモリ領域をゼロ ( '\0') で初期化しますが、このmemset()呼び出しにより、メモリを埋めるバイトを選択できます。

速度に関しては、メモリをゼロにする必要がある場合は+calloc()よりも高速になる可能性があります。は初期化されていないメモリをより速く返しますが、それでも への追加の呼び出しが必要です。malloc()memset()malloc()memset()

基本的に、メモリをゼロにしたい場合は、calloc();を使用します。初期化せずに残したい場合は、 を使用しますmalloc()

于 2012-05-22T06:01:16.133 に答える
3

重要な違いの 1 つは、オーバーフローした場合calloc(nmemb, size)に返されることを期待していることです。代わりに を使用すると、乗算オーバーフローにより、予想よりも小さいバッファーが要求される可能性があります (これは、後でセキュリティの問題につながる可能性があります)。したがって、呼び出しを呼び出しに置き換えることを計画している場合は、注意が必要です。NULLnmemb * sizemalloc(nmemb * size)callocmalloc

于 2012-05-22T06:54:25.780 に答える