mallocとcalloc関数の基本的な違いは、calloc()がmalloc()で必要とされる引数の代わりに二つの引数を必要とす Malloc()とcalloc()はどちらも、Cプログラミング言語が実行時に動的メモリ割り当てと割り当て解除を提供する関数です。
malloc()とcalloc()関数を理解する前に、まず動的メモリ割り当ての意味を理解しましょう。 メモリ割り当ては、プログラムおよびプロセスの実行のためにコンピュータメモリを割り当てる手順である。 プログラムとプロセスにどのくらいのメモリ空間が必要かが事前に分かっていない場合、動的割り当て技術を使用します。
動的メモリ割り当ては、格納されている要素が少ない場合、残りのメモリが不必要に無駄になるなど、静的メモリ割り当てに関連する問題のた したがって、メモリが必要なときにのみ割り当てられる静的メモリ割り当ての問題を克服します。
コンテンツ: malloc()対calloc()
- 比較チャート
- 定義
- 主な違い
- 結論
比較チャート
比較の基礎 | malloc(th> | calloc() | |||
---|---|---|---|---|---|
ブロックの数 | 要求されたメモリの単一のブロックを割り当てます。 | 要求されたメモリの複数のブロックを割り当てます。 | |||
構文 | void*malloc(size_t size); | void*calloc(size_t num,size_t size); | Void*calloc(size_t num,size_t size); | Void*calloc(size_t num,size_t size); | ; |
初期化 | malloc()は、割り当てられたメモリをクリアして初期化しません。 | 割り当てられたメモリはcalloc()を使用してゼロに初期化されます。 | |||
割り当ての方法 | malloc()関数は、ヒープからサイズ’size’のメモリを割り当てます。 | calloc()関数は、num*sizeに等しいサイズのメモリを割り当てます。 | |||
速度 | 高速 | 比較的遅いです。 |
malloc()の定義
malloc関数は、メモリブロックをバイト単位で割り当てます。 ユーザーはブロックサイズを明示的に指定する必要があり、使用に必要です。
Malloc関数プログラムは、メモリの割り当てのためにシステムのRAMを要求し、要求が認められた場合(すなわち、malloc関数はメモリの割り当てに成功したと これは、任意の型のポインタを割り当てることができることを意味するvoid型のポインタを返します。ただし、malloc関数が必要な量のメモリを割り当てることができない場合は、NULLを返します。 MALLOC関数は、TURBO Cのヘッダーファイルalloc.h
stdlib.h
でアクセスでき、UNIXではヘッダーファイル<malloc.h>
構文
この関数の構文は次のとおりです。
malloc(number of elements * size of each element);
たとえば、int *ptr;
ptr=malloc(10*sizeof (int))
ここで、sizeはバイト単位で必要なメモリのサイズを表します(すなわち、割り当てられる連続したメモリ位置の数)。
しかし、関数mallocがvoidポインタを返すことを前に述べたように、その結果、キャスト演算子は、私たちの必要性に基づいて返されたポインタ型を変更:
ptr_var=(type_cast* ) malloc (size)
ここで、ptr_var
type_cast
は、返されたポインたとえば、次のようにします。int *ptr;
ptr=(int*) malloc (10 * size of (int));
malloc関数によって割り当てられたメモリにはガベージ値が含まれています。
対応する要求がシステムRAMによって付与されたメモリを割り当てるためにmallocによって生成されたか、または拒否された場合(必要なスペースが 必要な量のメモリが割り当てられていないプロパティを使用することができますmalloc関数はNULLを返します。
calloc()の定義
calloc関数は、malloc()の場合のように二つの引数を必要とするという事実を除いて、malloc関数とまったく同じように動作します。たとえば
:int*ptr;
ptr = (int*)calloc(10,2);
ここで2は、割り当てを行うバイトのデータ型のサイズを指定します。 そして、10は、割り当てが行われる要素の数を意味します。
関数mallocに渡された引数は(n*10)であったことを覚えておいてください、それは単一の引数です複数の引数は常にカンマで区切られているので混同 引数(n*10)の間にカンマはありません。 したがって、それは単一の引数ですが、単純な引数ではなく式です。
上記の宣言に戻って、上記の文の実行に続いて、20バイトのメモリブロックが要求元のプログラムに割り当てられ、最初のブロックのアドレスが要求元のプログラムに割り当てられ、最初のブロックのアドレスがポインタptrに割り当てられます。
calloc関数によって割り当てられたメモリはすべてゼロを保持します。 Calloc関数は、TURBO Cのヘッダーファイル<stdlib.h>
<alloc.h>
でも取得できます。
mallocとcallocの主な違い
mallocとcalloc関数の主な違いは次のとおりです。
- 要求されたメモリの単一のブロックはmallocに割り当てられ、要求されたメモリの複数のブロックはcallocによって割り当てられます。
- malloc関数は、割り当てられたメモリをクリアして初期化しません。 これは、割り当てられたメモリのガベージ値と項目を変更することはできませんが含まれています。 対照的に、callocは割り当てられたメモリをゼロに初期化します。
- mallocは、callocの初期化の追加ステップが必要なため、callocよりも高速ですが、その違いはごくわずかです。
- これら2つの別の違いは、callocがmalloc+memsetであり、memsetはメモリ内の物理ページを割り当て、mallocは仮想アドレスのヒープからのメモリのみを割り当てることです。
結論
malloc関数とcalloc関数の両方がメモリの割り当てに使用され、特定の利点があり、mallocのような欠点はcallocと比較して高速です。 また、callocはメモリを割り当て、メモリ領域をゼロで初期化するので、mallocは一つの引数だけを取るので使いやすくなります。 しかし、変数の初期化がより重要な場合は、callocを使用することをお勧めします。