memsetが続くcallocとmallocの違いは何ですか? calloc へのすべての呼び出しを malloc の後に memset に置き換えた場合、同じになりますか?
その場合、malloc と calloc の 2 つの関数が別々に提供されているのはなぜですか?
はcalloc()
常にメモリ領域をゼロ ( '\0'
) で初期化しますが、このmemset()
呼び出しにより、メモリを埋めるバイトを選択できます。
速度に関しては、メモリをゼロにする必要がある場合は+calloc()
よりも高速になる可能性があります。は初期化されていないメモリをより速く返しますが、それでも への追加の呼び出しが必要です。malloc()
memset()
malloc()
memset()
基本的に、メモリをゼロにしたい場合は、calloc()
;を使用します。初期化せずに残したい場合は、 を使用しますmalloc()
。
重要な違いの 1 つは、オーバーフローした場合calloc(nmemb, size)
に返されることを期待していることです。代わりに を使用すると、乗算オーバーフローにより、予想よりも小さいバッファーが要求される可能性があります (これは、後でセキュリティの問題につながる可能性があります)。したがって、呼び出しを呼び出しに置き換えることを計画している場合は、注意が必要です。NULL
nmemb * size
malloc(nmemb * size)
calloc
malloc