C言語のメモリの扱い

### メモリ管理の概要
1. メモリ確保
2. メモリ解放
の順番で制御する

– メモリリーク
確保したメモリを不要になっても解放せずにいると、結果としてメモリ不足となって確保できなくなる

### メモリ確保・解放関数
– malloc
指定されたサイズのメモリを確保する
確保できない場合はNullを返す

– calloc
指定されたサイズのメモリブロックを確保し、確保した領域を0クリアする
確保できない場合はNullを返す

– realloc
確保済みのメモリを拡張する
確保できない場合はNullを返す

– free
malloc, calloc, reallocで確保した領域を解放する関数

# include <stdlib.h>

int main(void) {

    printf("Practice C  Memory Programming!! \n");

    // 100 byteのメモリ確保
    char* p = malloc(100);
    if (p == NULL) {
        // 確保できなかった時の処理
    }

    int* p2 = calloc(100, sizeof(int));
    if (p2 == NULL){}

    char* p3 = realloc(p, 200);
    if (p3 == NULL) {
    } else {
        p = p3;
    }

    free(p2);
    free(p);

    return 0;
}
#include <stdio.h>
#include <stdlib.h>

int main() {

    printf("Practice C  Memory Programming!! \n");

    int *p;

    p = (int *)malloc(sizeof(int));

    if (p == NULL) {
        printf("メモリの確保に失敗しました\n");
        return 1;
    }

    *p = 55;
    printf("pが指す値: %d\n", *p);

    free(p);

    return 0;
}

$ ./test
Practice C Memory Programming!!
pが指す値: 55

配列の場合

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

int main() {

    printf("Practice C  Memory Programming!! \n");

    int *arr;
    int n = 5;

    arr = (int *)malloc(n * sizeof(int));

    if (arr == NULL) {
        printf("メモリの確保に失敗しました\n");
        return 1;
    }

    for (int i = 0; i < n; i++){
        arr[i] = i * 10;
    }

    for (int i = 0; i < n; i++) {
        printf("arr[%d] = %d\n", i, arr[i]);
    }

    free(arr);

    return 0;
}

$ ./test
Practice C Memory Programming!!
arr[0] = 0
arr[1] = 10
arr[2] = 20
arr[3] = 30
arr[4] = 40