Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語のmalloc関数とは?動的メモリ確保の基本をわかりやすく解説

C言語の標準ライブラリに含まれるメモリ確保関数 void *malloc(size_t size) は、要求されたサイズのメモリ領域を確保し、その先頭アドレスを指すポインタを返します。

メモリ確保の2つの方法

プログラムでメモリを確保する方法は、主に以下の2つがあります。

  • 静的メモリ確保(コンパイル時):コンパイルの時点でメモリサイズが決定される
  • 動的メモリ確保(実行時):プログラムの実行中に必要な分だけメモリを確保する

コンパイル時にメモリを確保した場合、実行中にそのサイズを変更することはできません。そのため、メモリが不足したり、逆に余分な領域が無駄になったりするという問題が生じます。

この問題を解決するのが動的メモリ確保です。プログラムの実行時に、ユーザーの要求に応じて必要なメモリだけを柔軟に確保できます。

動的メモリ管理に使用される標準ライブラリ関数は以下の4つです。

  • malloc( )
  • calloc( )
  • realloc( )
  • free( )

malloc()関数とは

malloc()関数は、実行時に指定されたバイト数のメモリブロックを1つ確保するために使用されます。戻り値はvoid型ポインタで、確保されたメモリ領域の先頭アドレスを指します。

malloc()の構文は以下の通りです。

void *malloc (サイズ(バイト数))

例1

以下はmalloc()関数の基本的な使用例です。

int *ptr;
ptr = (int *) malloc (1000);
int *ptr;
ptr = (int *) malloc (n * sizeof (int));

注意 − 空きメモリがなく確保に失敗した場合は、NULLを返します。

サンプルプログラム

以下は、動的メモリ確保関数malloc()の使い方を示すCプログラムです。

#include<stdio.h>
#include<stdlib.h>
void main(){
    //変数とポインタの宣言//
    int numofele,i;
    int *p;
    //要素数の入力//
    printf("Enter the number of elements in the array: ");
    scanf("%d",&numofele);
    //malloc関数によるメモリ確保//
    p = (int *)malloc(numofele * (sizeof(int)));
    //配列への要素格納と表示//
    for(i=0;i<numofele;i++){
        p[i]=i+1;
        printf("Element %d of array is : %d\n",i,p[i]);
    }
}

実行結果

上記のプログラムを実行すると、以下のような結果が出力されます。

Enter the number of elements in the array: 4
Element 0 of array is : 1
Element 1 of array is : 2
Element 2 of array is : 3
Element 3 of array is : 4

例2

次は、動的メモリ確保関数を使って要素を入力・集計し、free()で解放した後のメモリ状態を確認するCプログラムです。

#include<stdio.h>
#include<stdlib.h>
void main(){
    //変数・ポインタ・合計値の宣言//
    int numofe,i,sum=0;
    int *p;
    //要素数の入力//
    printf("Enter the number of elements : ");
    scanf("%d",&numofe);
    //malloc()関数の呼び出し//
    p=(int *)malloc(numofe*sizeof(int));
    /*メモリが正常に確保・予約できたかどうかを
    確認するためif文を使用*/
    if (p==NULL){
        printf("Memory not available");
        exit(0);
    }
    //要素の入力と合計の計算//
    printf("Enter the elements : \n");
    for(i=0;i<numofe;i++){
        scanf("%d",p+i);
        sum=sum+*(p+i);
    }
    printf("\nThe sum of elements is %d",sum);
    free(p);//メモリの解放//
    printf("\nDisplaying the cleared out memory location : \n");
    for(i=0;i<numofe;i++){    
        printf("%d\n",p[i]);//ガベージ値が表示される//
    }
}

実行結果

上記のプログラムを実行すると、以下のような結果が出力されます。free()で解放された後のメモリ領域には不定値(ガベージ値)が表示される点に注目してください。

Enter the number of elements : 5
Enter the elements :
12
10
24
45
67
The sum of elements is 158
Displaying the cleared out memory location :
7804032
0
7799120
0
67
  1. C#プログラミングとは?初心者にもわかる特徴と基本を徹底解説

    C#(シーシャープ)とは何かC#は、Microsoft(マイクロソフト)が開発したモダンで汎用性の高いオブジェクト指向プログラミング言語です。Windowsアプリケーションの開発をはじめ、Webサービス、ゲーム開発(Unity)、業務システムなど、幅広い分野で活用されています。C#は「共通言語基盤(CLI:Common Language Infrastructure)」向けに設計されています。CLIは実行可能なコードとランタイム環境から構成されており、これにより異なるコンピュータプラットフォームやアーキテクチャ上で、さまざまな高水準言語を利用できるようになっています。C#の主な特徴C#には、開

  2. C#のDictionary(辞書)とは?宣言・初期化の基本をわかりやすく解説

    C#のDictionary(辞書)とは C#におけるDictionary(ディクショナリ)は、キー(Key)と値(Value)のペアを格納するためのコレクションです。各キーは一意である必要があり、キーを指定することで対応する値へ高速にアクセスできるのが大きな特徴です。 Dictionaryは、System.Collections.Generic名前空間に含まれています。利用する際は、この名前空間をusingディレクティブで追加しておきましょう。 Dictionaryの宣言と初期化 Dictionaryを宣言して初期化するには、以下のように記述します。 IDictionary<int,