malloc() と calloc() の違い

malloc() と calloc() の主な違い

  • malloc() 関数は開始アドレスのみを返し、ゼロにはしませんが、calloc() 関数は開始アドレスを返し、ゼロにします。
  • malloc 関数の引数の数は 1 ですが、calloc 関数の引数の数は 2 です。
  • malloc() の時間効率は calloc() よりも高いですが、malloc() は calloc() に比べて安全ではありません
  • malloc はメモリを初期化しませんが、calloc はメモリの初期化を実行します。
malloc() と calloc()
malloc() と calloc()

動的メモリ割り当てとは何ですか?

動的メモリ割り当て 実行時にメモリを割り当てるプロセスです。 calloc()、free()、 realloc()、および malloc() は、プログラムの実行中にメモリを割り当てて解放するために使用できます。 これらのルーチンは、stdlib.h というヘッダー ファイルで定義されます。

malloc()とは何ですか?

これは、メモリのブロックを動的に割り当てるために使用される関数です。 指定されたサイズのメモリ空間を予約し、メモリ位置を指す null ポインタを返します。

返されるポインタは通常、void 型です。 これは、malloc 関数を任意のポインターに割り当てることができることを意味します。 malloc の完全な形式はメモリ割り当てです。

calloc() とは何ですか?

Calloc() 関数 複数のメモリ ブロックを割り当てるために使用されます。これは、配列や構造体などの複雑なデータ構造にメモリを割り当てるために使用される動的メモリ割り当て関数です。この関数が指定された十分なスペースを割り当てられなかった場合、null ポインターを返します。calloc 関数の完全な形式は連続割り当てです。

malloc() と calloc() の違い

malloc() と calloc() の重要な違いは次のとおりです。

malloc() calloc()
Malloc() 関数は、ユーザーが指定したサイズの単一のメモリ ブロックを作成します。 Calloc() 関数は、変数に複数のメモリ ブロックを割り当てることができます。
Malloc 関数にガベージ値が含まれています。 calloc 関数によって割り当てられたメモリ ブロックは常に XNUMX に初期化されます。
引数の数は 1 です。 引数の数は2です。
Calloc は malloc よりも遅いです。 Malloc は calloc よりも高速です。
calloc と比べて安全ではありません。 malloc に比べて安全に使用できます。
calloc() よりも時間効率が高くなります。 時間効率は malloc() よりも低くなります。
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 言語プログラムは、最初の XNUMX 項の合計を計算します。 ポインタ値が 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

なぜ malloc() を使うのでしょうか?

malloc() を使用する理由は次のとおりです。

  • 実行時にメモリを割り当てる必要がある場合は、malloc() を使用する必要があります。
  • 現在のメモリ ブロックの実行を超えて存在する必要があるオブジェクトを割り当てる必要がある場合は、malloc を使用する必要があります。
  • スタックのサイズを超えるメモリを割り当てる必要がある場合は、malloc() を使用してください。
  • 割り当てられたスペースの最初のバイトへのポインタを返します。
  • これにより、開発者は必要に応じて正確な量のメモリを割り当てることができます。
  • この関数は、ヒープからメモリ ブロック サイズのバイトを割り当てます。

なぜ calloc() を使うのでしょうか?

calloc() を使用する理由は次のとおりです。

  • 割り当てられたメモリをゼロに設定する必要がある場合。
  • ポインタを返す calloc を使用して、メモリ ヒープにアクセスできます。
  • 要素をゼロに初期化してメモリへのポインタを返す必要がある場合に使用されます。
  • malloc() で発生する可能性のあるオーバーフローを防ぐには
  • 既にゼロ化されていることがわかっているページをリクエストするには、calloc() を使用します。