### メモリ管理の概要
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