Project_OKI’s diary

エンジニアの勉強ブログ

C言語基礎知識35(malloc関数とfree関数について)

malloc関数とfree関数

この記事では、C言語におけるmalloc関数とfree関数の内容と使用方法について記載する。

 

1. 目的

 ・malloc関数とfree関数の意味について知る。

 ・malloc関数とfree関数の使い方を知る。

 

目次

 

2. malloc関数とは

 ・動的メモリを確保する関数

 ・プログラムで予め、メモリを確保せず、必要な場所で必要なメモリを確保できる。

 ・成功時には、確保したメモリアドレスが、失敗時にはNULLがreturnされる。

 ・配列など、プログラム作成時点で、メモリサイズが決まらない場合に、使用する。

  →ファイルを読み込み、そのファイルから文字列を配列に格納する時など。

   ファイルにより、必要なサイズが異なり、プログラム作成時点で分からない場合がある。

 

 2.1malloc関数の使い方

 ・必要ヘッダファイル:stdlib.h

 ・使用方法:  変数 = malloc(size_t);

   引数:size_t型(サイズを表す型)

 例:

    int *addr;
    addr = (int *)malloc(4);       //メモリを4バイト確保
 

3. free関数とは

 ・malloc関数やcalloc関数、realloc関数など、

  動的に確保されたメモリを解放する為の関数。

 ・解放されたメモリは、再利用可能な状態となる。

 

 ・この解放を行わないと、確保したメモリが他のプログラムで使用できず、

  メモリを確保し続けると他のプログラムで使用できるメモリが減っていく。

 ・確保したメモリが不要になった場合は、このfree関数で、メモリを開放する必要がある。

 ・特に長時間動作するプログラムなどで、メモリの解放を忘れ、メモリ確保を行い続けると、メモリが足らなくなり、バグが発生してしまうなどが起こる。

 

 

 2.2 malloc関数を使用したプログラム
#include <stdio.h>
#include <stdlib.h>

int main(void){
    // Your code here!
    char *addr;
    int i;
    addr = (char *)malloc(1);       //1バイト確保
    
    for(i=0;i<127;i++){
        addr[i] = i+1;
        printf("%d\n",addr[i]);     //addrに格納された数値を表示
    }
    free(addr);                     //メモリ解放
}

 ・実行結果:https://paiza.io/projects/WJaosmK2yfWX4AF7od1Unw

 

メモリ確保失敗時の処理を追加した場合

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

int main() {
    int *arr;
    int size = 5;

    // int型の要素を5つ分確保する
    arr = (int *)malloc(size * sizeof(int));

    if (arr != NULL) {
        // メモリが正常に確保された場合、要素に値を代入して使用できる
        for (int i = 0; i < size; i++) {
            arr[i] = i + 1;
            printf("%d\n",arr[i]);
        }
        // メモリの使用が終わったら解放する
        free(arr);
    } else {
        printf("メモリの確保に失敗しました。\n");
    }

    return 0;
}

 ・実行結果:https://paiza.io/projects/8CSNDM-RGO6WuSLc-FECrg?language=c

 

 

参考:

 ・【C言語】malloc関数(メモリの動的確保)について分かりやすく解説 | だえうホームページ

 ・【C言語】free関数の使い方と注意点について解説 | だえうホームページ

 ・malloc

 

 

組み込みC言語