重複の可能性:
malloc と calloc の c の違い
calloc はブロックの形でメモリを割り当て、malloc は単一のブロックにメモリを割り当てますが、両方ともメモリを連続的に割り当てますか?障害がある場合、calloc は障害をジャンプして残りのヒープメモリに別のブロックを割り当てることができますか? 問題を明確にしたいと思います。
重複の可能性:
malloc と calloc の c の違い
calloc はブロックの形でメモリを割り当て、malloc は単一のブロックにメモリを割り当てますが、両方ともメモリを連続的に割り当てますか?障害がある場合、calloc は障害をジャンプして残りのヒープメモリに別のブロックを割り当てることができますか? 問題を明確にしたいと思います。
どちらの関数も、1 つの連続したブロックにメモリを割り当てます。パラメータの違いは、基礎となる割り当て戦略の違いを反映していません。それは歴史的な矛盾であり、それ以上のものではありません。
(この結論への道筋を推論することができます。 calloc が連続していないブロックを割り当てる場合、呼び出し元は穴がどこにあり、それらをスキップする方法をどのように知るのでしょうか? 呼び出し元が受け取るのは単一のポインターだけです。たとえば、ブロックのリンクされたリスト。これは、非連続領域にアクセスするために必要なものです。)
calloc(n,s)
またはmalloc(n*s)
;を呼び出します。calloc が乗算を行います。それだけです。必要に応じて引数を切り替えることができcalloc(s,n)
ます。サイズ「n」の「s」個のオブジェクトを割り当てるという考えは単なる概念的なものであり、システムは実際にそれを追跡したり強制したりしません。calloc(4,1)
と同等calloc(1,4)
です と同等calloc(2,2)
です。
この 2 つの唯一の意味のある違いは、calloc がメモリをゼロに設定することです。malloc は初期化されていないため、メモリをクリアする必要がない場合はより効率的です。
ジョンが言うように、違いは歴史的な理由で存在し、割り当て戦略に実際の違いはありません。ただし、指摘する価値のある違いの 1 つは、calloc
ed メモリがゼロに設定され、malloc
初期化されていないメモリへのポインタを返すことです。