web-dev-qa-db-ja.com

C-calloc()v。malloc()

可能性のある複製:
c mallocとcallocの違い

この声明の意義を説明してください、

Malloc()関数とcalloc()関数のもう1つの違いは、malloc()関数によって割り当てられたメモリにはガベージ値が含まれ、calloc()関数によって割り当てられたメモリにはすべてゼロが含まれるということです。

ソース( 'C' Programming、Salim Y. Amdani)

ありがとう

32
Kevin Meredith

から http://wiki.answers.com/Q/Is_it_better_to_use_malloc_or_calloc_to_allocate_memory

malloc()は、calloc()がすべてのゼロを含むように割り当てられたメモリを初期化するため、高速です。通常、メモリを自分で使用して初期化する必要があるため、calloc()のこの追加の利点は必要ない場合があります。

39
Edward Leno

callocは使用する前にメモリを初期化しますが、mallocは初期化しません。

this リンクを参照してください:

Calloc()関数は、バイト単位のサイズがelsizeであるnelem要素の配列に未使用のスペースを割り当てます。スペースはすべてのビット0に初期化されます。

mallocを使用すると、同じ効果を保証したい場合は、memsetなどを呼び出してメモリをリセットする必要があります。

char* buffer = (char*)malloc(100);
memset(buffer,0,100);

callocは余分なステップを省きます。メモリを初期化することの重要性は、変数を未知の状態ではなく既知の状態にすることです。したがって、予想される値について変数、たとえば配列要素をチェックする場合、変数を事前に初期化しておくことで、チェックしている値がゴミではないことを確認できます。 つまり、ごみ値と正当な値を区別できます。

たとえば、変数にゴミを残して、42などの値をチェックしている場合、プログラムによって値が実際に42に設定されているかどうか、またはそれが単なるゴミであるかどうかを知る方法がありません初期化しませんでした。

24
dcp

calloc(...)は基本的にmalloc + memsetです(メモリを0に初期化する場合)

ptr = malloc(sizeof(struct fubar));
memset(ptr, 0, sizeof (struct fubar)); //here we could use some different value instead of 0 whereas calloc always 0 initialises.

mallocを使用してメモリを割り当てると、以前の内容はクリアされません(つまり、初期化されません)。マシンの起動時に設定されたランダムな値を取得したり、以前に実行したプログラムに属していたが割り当てとプログラムの終了後にクリアされなかったメモリの一部が表示される場合があります。

calloc自体はmallocよりも低速です。割り当てられたメモリの内容をクリアするのに時間がかかるためです。したがって、メモリを割り当ててそこにコピーするだけでよい場合は、mallocを自由に使用できます。

8
plaes

Calloc()でメモリを割り当てた場合、割り当てるものはすべて0になります。つまり、整数の配列にスペースを割り当てた場合、それらはすべて0に設定されますが、malloc()では、メモリはありません。いかなる方法でも初期化されません。

とにかくメモリに0のmemsetを実行するだけの状況でcallocを使用できます。

3
Shawn D.