33

Possible Duplicate:
c difference between malloc and calloc

Please explain the significance of this statement,

Another difference between the malloc() and calloc() functions is that the memory allocated by malloc( ) function contains garbage values, while memory allocated by calloc( ) function contains all zeros.

Source ('C' Programming, Salim Y. Amdani)

Thanks

4

4 に答える 4

41

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

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

于 2010-08-10T12:51:03.907 に答える
25

calloc使用する前にメモリを初期化していますが、そうでmallocはありません。

次のリンクを参照してください。

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

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

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

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

たとえば、変数にガベージをそのままにして、たとえば 42 などの値をチェックしている場合、その値がプログラムによって本当に 42 に設定されたのか、それとも単にガベージが残っているだけなのかを知る方法はありません。初期化していません。

于 2010-08-10T12:49:55.340 に答える
9

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すると、以前の内容はクリアされません (つまり、初期化されません)。マシンの起動時に設定されたランダムな値を取得したり、以前に実行されていたプログラムに属していたメモリの一部が割り当てられてプログラムが終了した後に不明のままになっている可能性があります。

callocmalloc割り当てられたメモリの内容をクリアするために時間を費やす必要があるため、それ自体はより遅くなります。したがって、メモリを割り当ててそこにコピーする必要がある場合は、自由に使用できますmalloc

于 2010-08-10T13:02:27.730 に答える
4

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

とにかくメモリに対して0のmemsetを実行しようとしている状況では、callocを使用できます。

于 2010-08-10T12:52:53.590 に答える