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

C言語の動的メモリ割り当てとは?仕組み・メリット・サンプルコードを解説


動的メモリ割り当て(Dynamic Memory Allocation)とは

動的メモリ割り当てとは、プログラムのコンパイル時ではなく実行時(ランタイム)に必要な分だけメモリを確保する手法のことです。C言語では、標準ライブラリの malloc()calloc() といった関数を使って実現します。

  • プログラムの実行時(ランタイム)にメモリを確保することを「動的メモリ割り当て」と呼びます。

  • calloc() 関数と malloc() 関数が、動的なメモリ確保をサポートしています。

  • これらの関数が返す値(確保した領域の先頭アドレス)をポインタ変数に代入することで、動的に確保したメモリ空間を扱えるようになります。

  • この方式では、プログラム単位がアクティブになっている間だけ変数にメモリが割り当てられます。

  • 動的メモリ割り当ての実装には、「ヒープ(heap)」と呼ばれるデータ構造が使用されます。

  • メモリの再利用が可能で、不要になったメモリはいつでも解放できます。

  • 必要な分だけ確保できるため、静的な割り当てよりも効率的にメモリを活用できます。

  • その一方で、この割り当て方式は静的メモリ割り当てに比べて実行速度が遅くなるというデメリットもあります。

  • プログラム実行中の任意のタイミングでメモリを解放できる点も大きな特徴です。

なお、malloc() などで確保したメモリは、使い終わったら free() 関数で必ず解放しましょう。解放を忘れるとメモリリークの原因となります。

サンプルプログラム

次のプログラムは、動的メモリ割り当て関数を使って、入力された一連の要素の中から偶数の合計と奇数の合計をそれぞれ計算するものです。

#include <stdio.h>
#include <stdlib.h>

void main(){
    // 変数とポインタの宣言
    int i, n;
    int *p;
    int even = 0, odd = 0;

    // 要素数の入力を受け取る
    printf("Enter the number of elements : ");
    scanf("%d", &n);

    // malloc() で要素数分のint型領域を動的に確保し、先頭アドレスをポインタpへ代入
    p = (int *)malloc(n * sizeof(int));

    /* メモリが正しく確保・予約できたかどうかを確認するためif文を使用 */
    if (p == NULL){
        printf("Memory not available");
        exit(0);
    }

    // forループで要素を読み込み、確保した領域に順番に格納していく
    printf("The elements are : \n");
    for(i = 0; i < n; i++){
        scanf("%d", p + i);
    }

    // 偶数と奇数に振り分けながら合計を計算
    for(i = 0; i < n; i++){
        if(*(p + i) % 2 == 0){
            even = even + *(p + i);
        }
        else{
            odd = odd + *(p + i);
        }
    }

    printf("The sum of even numbers is : %d\n", even);
    printf("The sum of odd numbers is : %d\n", odd);

    // 使い終わったメモリは必ず解放する
    free(p);
}

実行結果

Enter the number of elements : 4
The elements are :
35
24
46
12
The sum of even numbers is : 82
The sum of odd numbers is : 35

この実行例では、4つの整数(35・24・46・12)を入力しました。偶数は 24・46・12 の3つで合計は 82、奇数は 35 の1つだけで合計は 35 となり、正しく計算できていることがわかります。


  1. ネットワークのインターフェースとサービスとは?基本概念と種類をわかりやすく解説

    ネットワークサービスとは 一般的にネットワークサービスとは、アプリケーション層以上で動作し、コンピュータネットワーク上で利用されるアプリケーションのことを指します。 ネットワークサービスは、データの保存(ストレージ)、操作(処理)、提示(プレゼンテーション)、通信といった機能を提供します。実装方式としては、クライアント・サーバ型アーキテクチャ、またはピアツーピア(P2P)型アーキテクチャが採用されます。 サービスインターフェースとは サービスインターフェースは、SOA(Service-Oriented Architecture:サービス指向アーキテクチャ)を実現するための仕組みです。これによ

  2. C言語における静的メモリ割り当てとは?仕組みとサンプルコードで徹底解説

    C言語でプログラムが使用するメモリは、大きく分けて「静的メモリ割り当て」と「動的メモリ割り当て」の2つの方法で確保されます。 静的メモリ割り当て(Static Memory Allocation)とは 静的メモリ割り当てとは、変数のサイズがプログラムの実行前に決定され、固定サイズの領域として割り当てられる方式です。一度確保されたメモリは、明示的に解放することはできません。プログラム内で宣言された変数に対して、あらかじめメモリが割り当てられます。 静的メモリ割り当ての主な特徴 アドレス演算子「&」を使って変数のアドレスを取得し、ポインタに代入することができます。 メモリはコンパイル時