8

IMO 1 つで十分ですが、なぜcallocそれを 2 つの引数に分割する必要があるのですか?

4

2 に答える 2

8

これはおそらく歴史であり、C が関数のプロトタイプを持っていた時代よりも前のことだと思います。これらの時点では、プロトタイプがなければ、引数は基本的に である必要がintあり、typedef size_tおそらく はまだ発明されていませんでした。しかし、それINTMAXはあなたが割り当てることができる最大のチャンクでmallocあり、それを2つに分割することで柔軟性が高まり、非常に大きな配列を割り当てることができます. 当時でも、システムから大きなページを取得する方法があり、デフォルトではゼロになっていcallocましたmalloc

現在、size_t関数プロトタイプが手元にあるため、これは C の豊かな歴史を日々思い起こさせるものにすぎません。

于 2011-09-24T07:31:04.627 に答える
3

パラメータ名はそれをかなりよく示しています:

void *malloc(size_t size);
void *calloc(size_t nelem, size_t elsize);

後者の形式では、要素の数と要素のサイズを指定することで、配列をきれいに割り当てることができます。mallocを乗算することにより、同じ動作を実現できます。

ただし、calloc割り当てられたメモリも 0 に初期化しmallocます。init を実行しないため、値は未定義です。mallocすべてのメモリを設定しないため、理論的には高速になる可能性があります。これは、大量の場合にのみ注目される可能性があります。

この質問callocでは、clear-alloc とmallocmem-allocが提案されています。

于 2011-09-24T01:45:44.937 に答える