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