データ構造とアルゴリズム 第10回 mallocとfree

Slides:



Advertisements
Similar presentations
メモリとポインタ. プログラムの前提 コンピュータは、0と1で計算をし、 0と1でデータを保存している。 メモリを学ぶのに必要な知識である。
Advertisements

アルゴリズムと データ構造 第 3 回 基本的なデータ構造(2) : 配列 1. 前回の復習 アルゴリズムの計算量 最悪(最大)計算量 計算量の漸近的評価 (オーダ)  多項式時間アルゴリズム( polynomial time algorithm )  指数時間アルゴリズム( exponential.
アルゴリズムとデータ構造 第2回 線形リスト(復習).
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
プログラミング入門2 第10回 動的な領域確保 情報工学科 篠埜 功.
第13回構造体.
第12回構造体.
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
第8回 プログラミングⅡ 第8回
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
構造体.
第4回放送授業.
アルゴリズムとデータ構造 第2回 線形リスト(復習その2).
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
演習問題の答え #include #include #define NUM 5 typedef struct { // 構造体の定義 float shincho; // 身長 float taiju; // 体重 } shintai; void hyouji(shintai.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
プログラミング論 関数ポインタ と 応用(qsort)
プログラミング論 ファイル入出力
精密工学科プログラミング基礎 第10回資料 (12/18実施)
プログラミング 4 記憶の割り付け.
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
アルゴリズムとデータ構造 補足資料5-2 「サンプルプログラムsetop.c」
メモリの準備 メモリには、その準備の方法で2種類ある。 静的変数: コンパイル時にすでにメモリのサイズがわかっているもの。 普通の変数宣言
プログラミング入門2 第11回 情報工学科 篠埜 功.
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
第13章 文字の取り扱い方 13.1 文字と文字型関数 13.2 文字列 13.3 文字型配列への文字列の代入
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
プログラミング論 ファイル入出力
第11回 プログラミングⅡ 第11回
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
プログラミング基礎a 第6回 C言語によるプログラミング入門 配列と文字列(その2)
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
データ構造とアルゴリズム 第11回 リスト構造(1)
アルゴリズムとプログラミング (Algorithms and Programming)
11: 動的メモリ確保 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
ポインタとポインタを用いた関数定義.
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
プログラミング論 ポインタ
ネットワーク・プログラミング Cプログラミングの基礎.
情報処理Ⅱ 第7回 2004年11月16日(火).
プログラミング 4 文字列.
11: 動的メモリ確保 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
TList リスト構造とは? 複数のデータを扱うために、 データの内容と、次のデータへのポインタを持つ構造体を使う。
プログラミング演習II 2003年10月29日(第2,3回) 木村巌.
プログラミング演習I 補講用課題
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

データ構造とアルゴリズム 第10回 mallocとfree 静岡大学工学部 安藤 和敏 2011.06.17

目次 変数とメモリ (復習) 配列の宣言とメモリ メモリの動的割り当て(malloc)と開放(free) プログラム例:malloc1.c (int型配列) プログラム例:malloc2.c (struct COMPLEX型) 実習

目次 変数とメモリ (復習) 配列の宣言とメモリ メモリの動的割り当て(malloc)と開放(free) プログラム例:malloc1.c (int型配列) プログラム例:malloc2.c (struct COMPLEX型) 実習

コンピュータのメモリのイメージ アドレス 内容 175 1 2 安藤 3 4 浜松 5 6 2004 7 ... ...

変数とメモリ ... ... アドレス 内容 int x; 175 と宣言することによって、xという名前が付けられた4バイト分のメモリ領域が確保される。 1 2 安藤 3 4 浜松 5:x: 6 2004 7 確保されるバイト数はその変数の型に依存する。p.18の表2.3を見よ。 以降は、この確保されたメモリ領域の内容をx と言う名前で参照できるようになる。 ... ...

ポインタとメモリ(教科書p.143-144) int x; int *p=&x; ポインタ変数 pの内容=7 アドレス 内容 175 1:p: 7 2 安藤 3 4 浜松 xの宣言によって確保されたメモリ領域 5 6 2004 7:x:

前ページのような状況を図示するために、このような矢線を用いて表現する。 ポインタとメモリの関係の図示 int x; int *p=&x; 前ページのような状況を図示するために、このような矢線を用いて表現する。 アドレス 内容 p: x:

目次 変数とメモリ (復習) 配列の宣言とメモリ メモリの動的割り当て(malloc)と開放(free) プログラム例:malloc1.c (int型配列) プログラム例:malloc2.c (struct COMPLEX型) 実習

配列の宣言とメモリ ・・・ int array[100]; 配列を、例えばこのように宣言すると、メモリ上に,array[0], array[1], …, array[99] という名前の付いた連続したメモリ領域がプログラムを実行した直後に確保される.この記憶場所には,int型のデータが記憶される. したがって、この宣言によって、100×4=400バイトのメモリがプログラムによって確保される。 実際に使わないメモリ領域をを無駄に確保するかも知れないし、

配列の宣言とメモリ(問題点) ・・・ int array[100]; ちょうど100個の整数のデータを格納することが事前に分かっていれば問題ない。 しかし、実行した後でないと何個のデータを格納しなければならないか分からないということが、良くある。 メモリ領域の過不足が生じる可能性がある。 特に携帯電話のように十分大きなメモリ領域が搭載されていないデバイス上で動くプログラムにおいては、メモリを効率的に使用しなければならない。

目次 変数とメモリ (復習) 配列の宣言とメモリ メモリの動的割り当て(malloc)と開放(free) プログラム例:malloc1.c (int型配列) プログラム例:malloc2.c (struct COMPLEX型) 実習

メモリの動的割り当て 前ページで述べた問題はメモリの動的割り当てという仕組みによって解決できる。 すなわち、データの個数がプログラムの実行前に分かっていなくても、プログラムの実行中にメモリを適切に確保できる。 C言語では、このメモリの動的割り当てを実現するために、mallocとfreeという関数が用意されている。 これらの関数は、ヘッダファイル stdlib.h の中で定義されている。

void *malloc (int size); 確保に成功すれば、確保したメモリの先頭のアドレス(番地)を返す。失敗した場合はNULLを返す。 確保するメモリのバイト数 void * は任意の型を持つ変数へのポインタという意味。実際に使うときには、キャスト演算子(p.22)によって、適当なポインタに変換する必要がある。

malloc の例(int 型のメモリ領域) int *p; p = (int *)malloc(sizeof(int)); 番地 メモリの内容 ポインタ変数 pのためのメモリ領域が確保される。 1 :p: 2 3 4 5 6 7

malloc の例(int 型のメモリ領域) int *p; p = (int *)malloc(sizeof(int)); (int *)malloc(sizeof(int)) そのアドレスは、適切な型に変換(キャスト)されなければならない。 番地 メモリの内容 1:p: mallocによって確保されたメモリ領域。sizeof(int)バイト=4バイト。mallocはこのメモリのアドレスを返す。 2 3 4 5 6 7

malloc の例(int 型のメモリ領域) int *p; p = (int *)malloc(sizeof(int)); p = ポインタ変数 p にmallocによって確保されたメモリのアドレス(5)が代入される。 番地 メモリの内容 1:p: 2 3 これ以降は、ここの内容は p を介して参照できる。例えば、*p=100とか。 4 5 6 7

free int free (void* p); 開放したいメモリ領域の先頭アドレス

目次 変数とメモリ (復習) 配列の宣言とメモリ メモリの動的割り当て(malloc)と開放(free) プログラム例:malloc1.c (int型配列) プログラム例:malloc2.c (struct COMPLEX型) 実習

配列の要素数をプログラムの実行後に決めることができる。 プログラム例 (malloc1.c) /* プログラム 10.5 配列の動的な割り当て */ #include <stdio.h> #include <stdlib.h> main(){ int i,n,*array; printf("N= "); scanf("%d",&n); if ((array=(int *)malloc(n*sizeof(int))) ==NULL) { fprintf(stderr,"malloc failed.\n"); exit(1); } 配列の要素数をプログラムの実行後に決めることができる。

mallocによって確保されたメモリ領域(n×4バイト) int *array; array=(int *)malloc(n*sizeof(int)); とすれば、配列 array の要素数をプログラムの実行中に決めることができる.だから、必要十分なメモリの確保が可能になる。 array: array[0]: array[1]: array[2]: ・・・ mallocによって確保されたメモリ領域(n×4バイト) ・・・ array[n-1]:

配列の要素数をプログラムの実行後に決めることができる。 プログラム例 (malloc1.c) (続き)   for(i=0;i<n;i++) { array[i]=i; printf("%d ", array[i]); } putchar('\n'); free(array); 配列の要素数をプログラムの実行後に決めることができる。

目次 変数とメモリ (復習) 配列の宣言とメモリ メモリの動的割り当て(malloc)と開放(free) プログラム例:malloc1.c (int型配列) プログラム例:malloc2.c (struct COMPLEX型) 実習

プログラム例 (malloc2.c) #include <stdio.h> #include <stdlib.h> #define PrintComplex(x) ...(省略) struct COMPLEX {double real; double img;} ; main(){ struct COMPLEX *a; a = (struct COMPLEX *) malloc(sizeof(struct COMPLEX)); a->real = 10; a->img =3; PrintComplex(*a); putchar('\n'); free(a); }

malloc の例(struct COMPLEX型のメモリ領域) struct COMPLEX *a; a = (struct COMPLEX *) malloc(sizeof(struct COMPLEX)); メモリの内容 ポインタ変数 a のためのメモリ領域が確保される。 a:

malloc の例(struct COMPLEX型のメモリ領域) そのアドレスは、適切な型に変換(キャスト)されなければならない。 struct COMPLEX *a; a = (struct COMPLEX *) malloc(sizeof(struct COMPLEX)); (struct COMPLEX *) malloc(sizeof(struct COMPLEX)) メモリの内容 mallocによって確保されたメモリ領域。sizeof(struct COMPLEX)バイト=16バイト。mallocはこのメモリのアドレスを返す。 a: (real) (img)

malloc の例(struct COMPLEX型のメモリ領域) struct COMPLEX *a; a = (struct COMPLEX *) malloc(sizeof(struct COMPLEX)); a = メモリの内容 ポインタ変数 a にmallocによって確保されたメモリのアドレスが代入される。 a: それ以降は、ここの内容はポインタ a を介して参照できる。 a->real, a->img で。 (real) (img)

プログラム例 (malloc2.c) #include <stdio.h> #include <stdlib.h> #define PrintComplex(x) ...(省略) struct COMPLEX {double real; double img;} ; main(){ struct COMPLEX *a; a = (struct COMPLEX *) malloc(sizeof(struct COMPLEX)); a->real = 10; a->img =3; PrintComplex(*a); putchar('\n'); free(a); }

目次 変数とメモリ (復習) 配列の宣言とメモリ メモリの動的割り当て(malloc)と開放(free) プログラム例:malloc1.c (int型配列) プログラム例:malloc2.c (struct COMPLEX型) 実習