• 検索結果がありません。

ヒントスライドPDF プログラミング演習2 #prog2bkc net prog2 ex03 malloc

N/A
N/A
Protected

Academic year: 2018

シェア "ヒントスライドPDF プログラミング演習2 #prog2bkc net prog2 ex03 malloc"

Copied!
20
0
0

読み込み中.... (全文を見る)

全文

(1)

第3週 動的メモリ確保とポインタ配列

(2)

動的メモリ確保

静的メモリ確保

下記のように宣言

動的メモリ確保

プログラムの実行時にメモリを確保すること

利点

メモリを有効活用できる

(必要分だけのメモリを確保できる)

利用例

リスト(7、8週)

int x[100];

プログラミングする時点で

サイズが分っている場合はこれでよい

各変数が確保すべきメモリ領域の大きさは 既知である必要

配列の場合,配列長も既知である必要 (コンパイル前に決める)

(3)

動的メモリ確保:malloc

void *malloc(size_t size);

解説:大きさsizeバイトのメモリ領域を確保する 戻り値:確保成功の場合

確保したメモリの先頭アドレス 確保失敗した場合

size_t型は符号無し整数型 負の数は受け付けない

確保 操作 解放

(4)

mallocの使い方

A *x;

x = (A *) malloc( sizeof(A) * B );

(型 *) malloc( sizeof() * 必要な個数 );

代入されるポインタ変数と同じ 型にキャストする

A x[B]; A:「char」「 int」「 struct 構造体名」などの型名 B:サイズ

確保 操作 解放

sizeof( )で型のバイトサイズを取得できる 例:sizeof( char )は、1が取得できる

静的メモリ確保

動的メモリ確保

(5)

malloc:文字列の例 char *str;

int size; ...

scanf("%d", &size);

str = (char *) malloc( sizeof(char) * ( size+ 1) );

(型 *) malloc( sizeof() * ( 必要な個数) );

文字列の場合は¥0の分 一つ多くメモリを確保する 代入されるポインタ変数と同じ

型にキャストする

確保 操作 解放

(6)

malloc:int配列の例 int *a;

int size;

scanf("%d", &size);

a = (int *) malloc( sizeof(int) * size );

(型 *) malloc( sizeof() * 必要な個数 );

代入されるポインタ変数と同じ 型にキャストする

確保 操作 解放

a[ 0 ] = 0; メモリ確保後は、 配列と同様に利用できる

(7)

malloc:エラー処理

(メモリ確保失敗) A *x;

x = (A *) malloc(sizeof(A) * B ); if(x == NULL){

//エラーメッセージ //エラー処理

}

A:「char」「 int」「 struct 構造体名」などの型名 B:必要名メモリのサイズ

メモリが確保できなかった場合には

ポインタ変数(x)にNULLが代入されます

確保 操作 解放

(8)

free:メモリの解放

A *x;

x = (A *) malloc(sizeof(A) * B ); if(x == NULL){

//エラーメッセージ //エラー処理

} ...

free(x);

A:「char」「 int」「 struct 構造体名」などの型名 B:サイズ

メモリの解放

free(ポインタ変数名);

確保 操作 解放

メモリの利用後は必ずメモリの解放すること 解放したいポインタ変数名を指定する

(9)

free でよくする間違い

data = (person *)malloc(sizeof(person)*2);

data->age = 30;

strcpy(data->name, "Tomoko Izumi");

data++;

data->age = 40;

strcpy(data->name, "Taro Ritsumei");

free(data);

data

person

person

(10)

必須課題3-1:ヒント(作成手順)

1. コンソールから文字列の最大長(数字)の入力 (scanfなどを利用)

2. 入力された文字列長のメモリを確保する (mallocを利用)

3. 2で確保したメモリ領域に文字列の入力を受け付け る (scanfなどを利用)

4. 入力された文字列を大文字にして逆順で出力

(11)

必須課題3-1:理解補助シート

(12)

ポインタ配列

アドレスを保存している配列

int *p[ 4 ];

配列

複数の同じ型の変数をまとめたもの

(13)

ポインタ配列:intのポインタ配列の例

int *p[4];

p[ 0 ] = (int *)malloc( sizeof(int) * 2 ); p[ 1 ] = (int *)malloc( sizeof(int) * 3 ); p[ 2 ] = (int *)malloc( sizeof(int) * 4 ); p[ 3 ] = (int *)malloc( sizeof(int) * 1 );

p[1] p[2] p[3] p[0]

A1 A2 A3 A4

(14)

必須課題3-2:ヒント(作成手順)

1. 文字列用のポインタ配列を宣言(char *name[ 5 ])

2. 名前を一人毎入力を受け付ける

1. 名前を格納できるメモリ領域を確保する

2. メモリ領域へのポインタを1で宣言したポインタ配列に格納する

3. 入力された人数分下記の項目を出力

 名前が格納されているアドレス

 名前

(15)

必須課題3-2:理解補助シート

(16)

malloc:「一つの構造体」を確保する例

Person *person;

person = ( Person *) malloc( sizeof( Person ) );

(型 *) malloc( sizeof() * 必要な個数 );

代入されるポインタ変数と同じ 型にキャストする

typedef struct Person{ char name[20]

int age; }Person;

この場合構造体1つ分を 確保する(* 1を省略)

(17)

復習:構造体:構造体メンバへのアクセス

Person person;

person.age = 30;

strcpy(person.name,”Takuya Azumi”);

メンバのアクセス方法 構造体の変数名.メンバ名 typedef struct Person{

char name[20] int age;

}Person;

(18)

構造体ポインタのメンバのアクセス方法

Person *person;

person = ( Person *) malloc( sizeof( Person ) ); //エラーチェック

person->age = 30;

strcpy(person->name,”Takuya Azumi”); typedef struct Person{

char name[20] int age;

}Person;

メンバのアクセス方法 ポインタ変数名->メンバ名

(19)

必須課題3-3:作成手順

1. 構造体のポインタ配列を定義

2. ファイルから読み込むデータ数(=行数)を取得 3. データが格納されているファイル名を取得

4. 2で入力されたデータ数分だけ、構造体のメモリ 領域を動的メモリ確保(malloc)し、それぞれの 先頭アドレスを1で定義したポインタ配列に確保 5. 3で指定されたファイルを開き、4で確保した構造

体にデータを格納

6. 格納したデータを課題1-4と同様の形式でファイ

(20)

著者リスト

1. 安積 卓也(情報システム学科)

2. 泉 朋子 (情報コミュニケーション学科) 3. 原田 史子(情報システム学科)

参照

関連したドキュメント

父馬名 母馬名 母父馬名 馬主名. 騎手名 負担重量

注:一般品についての機種型名は、その部品が最初に使用された機種型名を示します。

夏  祭  り  44名  家族  54名  朝倉 EG 八木節クラブ他14団体  109名 地域住民約140名. 敬老祝賀会  44名  家族 

専任教員 40 名のうち、教授が 18 名、准教授が 7 名、専任講師が 15 名である。専任教員の年齢構成 については、開設時で 30〜39 歳が 13 名、40〜49 歳が 14 名、50〜59 歳が

          ITEC INTERNATIONAL 株式会社. 型名

日数 ワクチン名 製造販売業者 ロット番号 接種回数 基礎疾患等 症状名(PT名).

目名 科名 種名 学名.. 目名 科名

生活介護  2:1  *1   常勤2名、非常勤5名  就労継続支援B型  7.5:1+1  *2