malloc() と calloc():主な違いを例で説明
malloc と calloc の違いを学ぶ前に、学びましょう-
動的メモリ割り当てとは
動的メモリ割り当ては、実行時にメモリを割り当てるプロセスです。プログラムの実行中にメモリを割り当てて解放するために使用できる、calloc()、free()、realloc()、および malloc() の 4 つのライブラリ ルーチンがあります。これらのルーチンは、stdlib.h というヘッダー ファイルで定義されています。
malloc() とは?
これは、メモリのブロックを動的に割り当てるために使用される関数です。指定されたサイズのメモリ空間を確保し、メモリ位置を指す null ポインタを返します。
通常、返されるポインタは void 型です。これは、malloc 関数を任意のポインターに割り当てることができることを意味します。 malloc の完全な形式はメモリ割り当てです。
このチュートリアルでは、次のことを学びます:
- 動的メモリ割り当てとは?
- malloc() とは?
- calloc() とは?
- malloc() を使用する理由
- calloc() を使用する理由
- malloc() の構文
- calloc() の構文
- C での malloc() の例
- C での calloc() の例
- calloc() と malloc() の違い
calloc() とは?
Calloc() 関数は、複数のメモリ ブロックを割り当てるために使用されます。これは、配列や構造体などの複雑なデータ構造にメモリを割り当てるために使用される動的メモリ割り当て関数です。この関数が指定された十分なスペースを割り当てられなかった場合、null ポインターが返されます。 calloc 関数の完全な形式は連続割り当てです。
malloc() を使用する理由
malloc() を使用する理由は次のとおりです
- 実行時にメモリを割り当てる必要がある場合は、malloc() を使用する必要があります。
- 現在のメモリ ブロックの実行後も存在しなければならないオブジェクトを割り当てる必要がある場合は、malloc を使用する必要があります。
- そのスタックのサイズよりも大きなメモリを割り当てる必要がある場合は、malloc() を使用してください。
- 割り当てられたスペースの最初のバイトへのポインタを返します。
- 開発者は必要に応じて正確な量のメモリを割り当てることができます。
- この関数は、ヒープからメモリ ブロック サイズのバイトを割り当てます。
calloc() を使用する理由
calloc() を使用する理由は次のとおりです
- 割り当てられたメモリをゼロに設定する必要がある場合。
- ポインタを返す calloc を使用してメモリ ヒープにアクセスできます。
- メモリへのポインタを返すために要素をゼロに初期化する必要がある場合に使用します。
- malloc() で発生する可能性のあるオーバーフローを防ぐため
- calloc() を使用して、既にゼロ化されていることがわかっているページをリクエストします。
malloc() の構文
malloc() の構文は次のとおりです
ptr = (cast_type *) malloc (byte_size);
上記の構文では、ptr は cast_type のポインターです。 malloc 関数は、byte_size の割り当てられたメモリへのポインタを返します。
Example: ptr = (int *) malloc (50)
このステートメントが正常に実行されると、50 バイトのメモリ空間が確保されます。予約済みスペースの最初のバイトのアドレスは、int 型のポインター「ptr」に割り当てられます。
calloc() の構文
malloc() の構文は次のとおりです
ptr = (cast_type *) calloc (n, size);
上記の構文は、同じサイズの n 個のメモリ ブロックを割り当てるために使用されます。メモリ空間が割り当てられると、すべてのバイトがゼロに初期化されます。現在、割り当てられたメモリ空間の最初のバイトにあるポインターが返されます。
C での malloc() の例
次のコードでは、sizeof(*ptr) を使用して 15 個の整数のメモリ ブロックを割り当てています。 printf ステートメントでは、6 番目の整数の値を見つけています。
#include<stdlib.h> #include<stdio.h> int main(){ int *ptr; ptr = malloc(15 * sizeof(*ptr)); if (ptr != NULL) { *(ptr + 5) = 480; printf("Value of the 6th integer is %d",*(ptr + 5)); } }
出力:
6 番目の整数の値は 480 です
C での calloc() の例
以下の C 言語プログラムは、最初の 10 項の合計を計算します。ポインタ値が null の場合、メモリ空間は割り当てられません。
for ループは、変数「i」の値を反復し、合計を出力するために使用されます。最後に、関数 free を使用してポインターを解放します。
#include <stdio.h> #include <stdlib.h> int main() { int i, * ptr, sum = 0; ptr = calloc(10, sizeof(int)); if (ptr == NULL) { printf("Error! memory not allocated."); exit(0); } printf("Building and calculating the sequence sum of the first 10 terms \n"); for (i = 0; i < 10; ++i) { * (ptr + i) = i; sum += * (ptr + i); } printf("Sum = %d", sum); free(ptr); return 0; }
出力:
最初の 10 項の数列和を構築して計算 n Sum =45
calloc() と malloc() の違い
malloc() と calloc() の重要な違いは次のとおりです:
malloc() calloc() Malloc() 関数は、ユーザーが指定したサイズの単一のメモリ ブロックを作成します。Calloc() 関数は、変数に複数のメモリ ブロックを割り当てることができます。Malloc 関数にはガベージ値が含まれています。calloc 関数によって割り当てられたメモリ ブロックは、常にゼロ。引数の数は1。引数の数は2。Callocはmallocより遅い。Mallocはcallocより速い。callocに比べて安全ではない。mallocに比べて安全に使用できる。callocよりも時間効率が高い。 ().malloc()よりも時間効率が悪い.Malloc()関数は開始アドレスのみを返し0にしない.アドレスを割り当てる前にCalloc()関数は開始アドレスを返し0にする.初期化は行わない.メモリの初期化を行います。主な違い:
- malloc() 関数は開始アドレスのみを返し、0 にはしませんが、calloc() 関数は開始アドレスを返し、0 にします。
- malloc 関数では引数の数が 1 ですが、calloc 関数では引数の数が 2 です。
- malloc() の時間効率は calloc() よりも高いのに対し、malloc() は calloc() に比べて安全ではありません
- malloc はメモリを初期化しませんが、calloc はメモリの初期化を行います。
C言語