malloc()およびcalloc()関数を理解する前に、まず動的メモリー割り当ての意味を理解しましょう。 メモリ割り当ては、プログラムやプロセスの実行用にコンピュータメモリを割り当てる手順です。 プログラムとプロセスに必要なメモリ容量が事前にわかっていない場合は、動的割り当て手法を使用します。
動的メモリ割り当ては、より少ない要素が格納される場合など、静的メモリ割り当てに関連する問題のために生じ、その場合、残りのメモリは不必要に無駄になる。 したがって、必要なときにだけメモリが割り当てられるという静的なメモリ割り当ての問題を解決します。
比較表
比較の基礎 | malloc() | calloc() |
---|---|---|
ブロック数 | 要求されたメモリの単一ブロックを割り当てます。 | 要求されたメモリの複数のブロックを割り当てます。 |
構文 | void * malloc(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(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
は、返されたポインタ(またはvoid型)の変換先のデータ型ですtype_cast
は、割り当てられたメモリブロックのサイズをバイト単位で表します。 。
例えば: int *ptr;
ptr=(int*) malloc (10 * size of (int));
malloc関数によって割り当てられたメモリに不要な値が含まれています 。
対応する要求がmallocによって生成されてシステムRAMによって付与されたメモリを割り当てるか、拒否されたかを確認します(必要なスペースが利用できない場合)。 malloc関数がNULLを返す必要な量のメモリが割り当てられていないというプロパティを利用することができます。
calloc()の定義
calloc関数はmalloc関数とまったく同じように動作しますが、malloc()の場合と同様に1つの引数しか必要とされないため、2つの引数が必要な点が異なります。
例えば: int*ptr;
ptr = (int*)calloc(10, 2);
ここで2は、割り当てを行いたいバイトのデータ型のサイズを指定します。これは整数の場合は2です。 そして、10は割り当てが行われる要素の数を表します。
関数mallocに渡される引数は(n * 10)であることを忘れないでください。複数の引数は常にコンマで区切られているので、混同しないでください。 引数(n * 10)の間にコンマはありません。 したがって、これは単一の引数ですが、単純なものではなく式です。
上記の宣言に戻ると、上記のステートメントの実行に続いて、20バイトのメモリブロックが要求プログラムに割り当てられ、第1ブロックのアドレスが要求プログラムに割り当てられ、そして第1ブロックのアドレスがポインタに割り当てられる。 ptr
calloc関数によって割り当てられたメモリはすべてゼロを保持します。 calloc関数はヘッダファイルでも入手可能です または
ターボCで
mallocとcallocの主な違い
malloc関数とcalloc関数の主な違いは以下のとおりです。
- 要求されたメモリの単一ブロックがmallocに割り当てられ、要求されたメモリの複数のブロックがcallocによって割り当てられます。
- malloc関数は割り当てられたメモリをクリアして初期化しません。 ゴミの値が含まれており、確保したメモリの項目は変更できません。 対照的に、callocは割り当てられたメモリをゼロに初期化します。
- callocでは初期化の追加手順が必要なため、mallocはcallocより高速ですが、その違いはごくわずかです。
- これら2つのもう1つの違いは、callocはmalloc + memsetであり、memsetはメモリ内の物理ページを割り当てるのに対し、mallocは仮想アドレス内のヒープからメモリを割り当てるだけです。
結論:
malloc関数とcalloc関数はどちらもメモリの割り当てに使用され、一定の利点があり、mallocのような欠点はcallocに比べて高速です。 さらに、callocはメモリを割り当て、メモリ領域をZEROで初期化するため、mallocは1つの引数しか必要としないため、使い方が簡単です。 しかし、 変数の初期化がより重要な場合は、callocを使用することをお勧めします。