IMO 1 つで十分ですが、なぜcalloc
それを 2 つの引数に分割する必要があるのですか?
2 に答える
これはおそらく歴史であり、C が関数のプロトタイプを持っていた時代よりも前のことだと思います。これらの時点では、プロトタイプがなければ、引数は基本的に である必要がint
あり、typedef
size_t
おそらく はまだ発明されていませんでした。しかし、それINTMAX
はあなたが割り当てることができる最大のチャンクでmalloc
あり、それを2つに分割することで柔軟性が高まり、非常に大きな配列を割り当てることができます. 当時でも、システムから大きなページを取得する方法があり、デフォルトではゼロになっていcalloc
ましたmalloc
。
現在、size_t
関数プロトタイプが手元にあるため、これは C の豊かな歴史を日々思い起こさせるものにすぎません。
パラメータ名はそれをかなりよく示しています:
void *malloc(size_t size);
void *calloc(size_t nelem, size_t elsize);
後者の形式では、要素の数と要素のサイズを指定することで、配列をきれいに割り当てることができます。malloc
を乗算することにより、同じ動作を実現できます。
ただし、calloc
割り当てられたメモリも 0 に初期化しmalloc
ます。init を実行しないため、値は未定義です。malloc
すべてのメモリを設定しないため、理論的には高速になる可能性があります。これは、大量の場合にのみ注目される可能性があります。
この質問calloc
では、clear-alloc とmalloc
mem-allocが提案されています。