プログラミング 4 記憶の割り付け.

Slides:



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

アルゴリズムと データ構造 第 3 回 基本的なデータ構造(2) : 配列 1. 前回の復習 アルゴリズムの計算量 最悪(最大)計算量 計算量の漸近的評価 (オーダ)  多項式時間アルゴリズム( polynomial time algorithm )  指数時間アルゴリズム( exponential.
C 言語講座 第 7 回 ポインター. メモリとアドレス(ポインターの前 に) コンピュータのメモリには 1 バイトずつ 0 番地、 1 番地、 2 番地・・・というように 住所が割り当てられている この住所をアドレスという。 メモリはデータをしまうもので それを引き出すためには メモリに番号(アドレス)を振っておけばよいな.
【事例演習5】  字句解析     解 説  “ハッシュを用いた字句解析の方法”.
アルゴリズムとデータ構造 第2回 線形リスト(復習).
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
情報処理演習C2 ファイル操作について (2).
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
プログラミング入門2 第10回 動的な領域確保 情報工学科 篠埜 功.
データ構造とアルゴリズム 第10回 mallocとfree
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
第8回 プログラミングⅡ 第8回
構造体.
情報処理Ⅱ 第13回 2006年1月20日(金).
アルゴリズムとデータ構造 第2回 線形リスト(復習その2).
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
演習問題の答え #include #include #define NUM 5 typedef struct { // 構造体の定義 float shincho; // 身長 float taiju; // 体重 } shintai; void hyouji(shintai.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
構造体 構造体, 構造体とポインタの組み合わせ,.
プログラミング 3 構造体(1).
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
プログラミング論 関数ポインタ と 応用(qsort)
Cプログラミング演習 第7回 メモリ内でのデータの配置.
iioLoadFile()とiioMallocImageBuffer()の補足
iioLoadFile()とiioMallocImageBuffer()の補足
精密工学科プログラミング基礎 第10回資料 (12/18実施)
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
第10章 これはかなり大変な事項!! ~ポインタ~
プログラミング 3 構造体(2).
メモリの準備 メモリには、その準備の方法で2種類ある。 静的変数: コンパイル時にすでにメモリのサイズがわかっているもの。 普通の変数宣言
プログラミング入門2 第11回 情報工学科 篠埜 功.
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
第11回 プログラミングⅡ 第11回
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
プログラミング基礎B 文字列の扱い.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
データ構造とアルゴリズム 第11回 リスト構造(1)
11: 動的メモリ確保 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
プログラミング 3 2 次元配列.
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
ポインタとポインタを用いた関数定義.
プログラミング論 ポインタ
アルゴリズムとデータ構造1 2009年6月15日
11: 動的メモリ確保 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページを開いておく こと
ネットワーク・プログラミング Cプログラミングの基礎.
情報処理Ⅱ 第7回 2004年11月16日(火).
11: 動的メモリ確保 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
プログラミング 4 文字列.
アルゴリズムとデータ構造 2010年6月17日
11: 動的メモリ確保 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
TList リスト構造とは? 複数のデータを扱うために、 データの内容と、次のデータへのポインタを持つ構造体を使う。
プログラミング演習II 2003年10月29日(第2,3回) 木村巌.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング 3 ポインタ(1).
Presentation transcript:

プログラミング 4 記憶の割り付け

変数の特徴 名前がついている(名前を呼んで使う) 使う分はあらかじめソースコードに書いておく 管理はプログラム側でしてくれる 配列の要素数はコンパイル時に決まっていないといけない 管理はプログラム側でしてくれる 扱いは簡単

記憶の割り付け 名前がついていない(ポインタで指す) 使う分をその都度プログラム中で要求する 管理はプログラマが行う 欲しい分だけ記憶領域を確保できる 管理はプログラマが行う 注意して扱わないといけない

malloc() 関数 引数で指定したバイト数の記憶領域を確保して,その 領域の先頭アドレスを void * 型で返す malloc(4) ← 4 バイト確保する この方法で確保した記憶領域は「名前がついていな い」ので,ポインタで指して使わなければならない この「ポインタが指している状態」をプログラマが管理しな ければならない 指せなくなると「メモリリーク」という重大な不具合につな がる #include <stdlib.h> で使えるようになる

sizeof 演算子 かっこ内の型が何バイトを要するかを調べる演算子 sizeof(int) ← int 型が何バイトか調べる malloc() 関数で確保するバイト数を計算するのによく用いる malloc(sizeof(int)) ← int 型と同じバイト数を記憶を確保

void * 型 「ポインタの型」は「指す先に何があるか」を表して いる int * 型:指す先に int がある double * 型:指す先に double がある void * 型は「指す先に何があるかの情報がない」 使うときには通常「指す先を何の型で解釈するのか」の情報 を与えるために型変換(キャスト)をする int と同じサイズの記憶領域を確保して,int として使えるよ うにする (int *)malloc(sizeof(int))

malloc() 関数の使い方 確保する記憶領域を指すポインタを用意する int *p; malloc() 関数で記憶を割り付ける;型変換に注意 p = (int *)malloc(sizeof(int)); これが常套句! 割り付けた記憶領域をポインタを経由して使う その記憶領域を指すポインタがなくならないように注意! 使い終わったら free() 関数で解放する free(p); 「使い終わったら後始末する」という手動での管理が必要

malloc() 関数は失敗する malloc() 関数は失敗することがあり,そのときは NULL を返す;通常は NULL チェックをする p = (int *)malloc(sizeof(int)); if (p == NULL) { …失敗時の処理…… } 簡単なプログラムでは,記憶の割り付けに失敗したら(その 先実行できそうになくなるから)プログラムを終了させてし まうことが多い if ((p = (int *)malloc(sizeof(int))) == NULL) { … } と一 気に書くこともある

記憶の割り付けの使い方(1) たとえばこんなプログラム int *p; p = (int *)malloc(sizeof(int)); if (p == NULL) { printf(“失敗しました\n”); return 0; } *p = 5; /* p の先に int の記憶領域がある */ printf(“%d\n”, *p); free(p); return 0;

構造体で使うことも多い たとえばこんなプログラム struct cplx { double re, im; }; …… struct cplx *c; c = (struct cplx *)malloc(sizeof(struct cplx)); if (c == NULL) { …… } …… free(c); あとで学ぶ「線形リスト」「二分木」では頻繁に使用 する

メモリリーク 確保した記憶領域を指すポインタがなくなってしまい, 操作不能(回収不能)に陥ること 記憶の割り付けは「プログラマが管理する」! 回収できないのでプログラム終了まで記憶領域を無駄に使用 し続けることになる→たび重なるとシステムが不安定になっ たりする 記憶の割り付けは「プログラマが管理する」!

割り付けで「配列」を作る(1) C 言語では配列の大きさはコンパイル時に決まってい なければいけない 配列の大きさをあとから決めることはできない 記憶の割り付けを使えば,あとから大きさを決められ る「配列と同等のもの」が作れる 配列は「記憶装置の連続した領域に確保される」ことから, 「記憶装置に連続した領域を確保すれば配列と同等に使え る」

割り付けで「配列」を作る(2) 型と個数を指定して割り付け int *p; p = (int *)malloc(sizeof(int) * 10); これで int×10 の記憶領域が確保され,大きさ 10 の配列と 同等に使える つまり *p,*(p + 1),*(p + 2),……,*(p + 9) が使え ることになるが,読み替えにより p[0],p[1],p[2],……, p[9] になる これはホンモノの配列ではないので,最後に free() 関数で解 放する必要がある

文字列ぴったりの記憶領域 文字列ぴったりの記憶領域を確保するのにも記憶の割 り付けが重用される ‘\0’ が入る分文字数+1 個を確保することに注意 たとえばこんなプログラム char s[256], *p; …s[] に何か文字列をセット … p = (char *)malloc( sizeof(char) * (strlen(s) + 1)); strcpy(p, s); ……