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

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

N/A
N/A
Protected

Academic year: 2018

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

Copied!
20
0
0

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

全文

(1)

第 3 週

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

(2)

動的メモリ確保

静的メモリ確保

下記のように宣言

動的メモリ確保

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

利点

メモリを有効活用できる

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

利用例

リスト(7、8週)

int x[100]; int x[100];

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

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

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

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

(3)

動的メモリ確保: malloc

void *malloc(size_t size);

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

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

void *malloc(size_t size);

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

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

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

確保 操作 解放

(4)

malloc の使い方

A *x;

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

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

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

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

A x[B];

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

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

確保 操作 解放

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

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

静的メモリ確保

動的メモリ確保

(5)

malloc :文字列の例 char *str;

int size;

...scanf("%d", &size);

str = (char *) malloc( sizeof(char) * ( size+ 1) ); 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 ); int *a;

int size;

scanf("%d", &size);

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

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

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

確保 操作 解放

a[ 0 ] = 0;

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

(7)

malloc: エラー処理

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

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

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

}

A *x;

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

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

}

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

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

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

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

確保 操作 解放

(8)

free: メモリの解放

A *x;

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

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

}

...free(x); A *x;

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

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

}...

free(x);

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

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 ]; 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 ); 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]

A 1

A1 A2

A 2

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 ) ); Person *person;

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

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

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

typedef struct Person{ char name[20]

int age; }Person;

typedef struct Person{ char name[20]

int age; }Person;

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

(17)

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

Person person; person.age = 30;

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

person.age = 30;

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

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

char name[20] int age;

}Person;

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”); Person *person;

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

person->age = 30;

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

char name[20] int age;

}Person;

typedef struct Person{ char name[20]

int age; }Person;

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

(19)

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

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

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

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

5. 3で指定されたファイルを開き、 4 で確保した構 造体にデータを格納

(20)

著者リスト

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

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

参照

関連したドキュメント

Q-Flash Plus では、システムの電源が切れているとき(S5シャットダウン状態)に BIOS を更新する ことができます。最新の BIOS を USB

・子会社の取締役等の職務の執行が効率的に行われることを確保するための体制を整備する

全体構想において、施設整備については、良好

その他 2.質の高い人材を確保するため.

さらに、93 部門産業連関表を使って、財ごとに、①県際流通財(移出率 50%以上、移 入率 50%以上) 、②高度移出財(移出率 50%以上、移入率

第一の場合については︑同院はいわゆる留保付き合憲の手法を使い︑適用領域を限定した︒それに従うと︑将来に

能率競争の確保 競争者の競争単位としての存立の確保について︑述べる︒

・ ○○ エリアの高木は、チョウ類の食餌木である ○○ などの低木の成長を促すた