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