メモリの準備 メモリには、その準備の方法で2種類ある。 静的変数: コンパイル時にすでにメモリのサイズがわかっているもの。 普通の変数宣言 Windows管理メモリ Test.c main() { int a; int data[10]; Test.exe a data
メモリの準備 メモリには、その準備の方法で2種類ある。 動的変数: コンパイル時にはメモリのサイズがわからず、 実行時に判るもの。 ポインタを使ったメモリの準備方法 関数 malloc()を使う。
malloc関数 #include <stdlib.h> または #include<alloc.h> void *malloc(size_t size); 用意したメモリの先頭アドレスを返す。 例: data=(int *)malloc(sizeof(int)*n); if (data == NULL){ printf(“メモリエラー”); return; }
動的変数: コンパイル時にはメモリのサイズがわからず、 実行時に判るもの。 ポインタを使ったメモリの準備方法 動的なメモリの準備 動的変数: コンパイル時にはメモリのサイズがわからず、 実行時に判るもの。 ポインタを使ったメモリの準備方法 Windows管理メモリ Test2.c main() { int n; int *data; printf(“input n=”); scanf(“%d”,&n); data = (int *)malloc(sizeof(int)*n); Test2.exe n data 10 0xff20 0xff20
範囲外のメモリにアクセスすると Test2.exe n data Windows管理メモリ 10 0xff20 ほかのプログラム 10 10
静的変数: アプリケーションが終了すると、 一緒に消える。 メモリの開放 静的変数: アプリケーションが終了すると、 一緒に消える。 Windows管理メモリ Test.exe a data
動的変数: アプリケーションが終了すると、 ポインタは一緒に消える。 メモリの開放 動的変数: アプリケーションが終了すると、 ポインタは一緒に消える。 動的に割り当てたメモリはのこってしまう! Windows管理メモリ Test2.exe n data 10 0xff20 0xff20
動的変数: アプリケーションが終了するまえに、 free関数でメモリを開放しておく。 メモリの開放 動的変数: アプリケーションが終了するまえに、 free関数でメモリを開放しておく。 Windows管理メモリ Test2.exe n data 10 0xff20 free(data); 0xff20
#include <stdlib.h> void free(void *block); 例: free(data);
関数 メイン関数内で他の関数が呼ばれると、 メイン SWAP(int x, int y) int a,b; a = 10;b = 5; SWAP(a,b) int c; c=x; x=y; y=c; a 10 5 b 10 5 a 10 b 5 c 10
関数 メイン関数内で他の関数が呼ばれると、 メイン SWAP(int *x, int *y) a 10 5 b 5 10 int a,b; SWAP(&a,&b) int c; c=*x; x=*y; *y=c; x 0xef y 0xcf c 10