メモリの準備

メモリの準備
メモリには、その準備の方法で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