可変長配列のサンプル

可変長サイズの配列の説明で malloc() + free() を解説。 名前と電話番号のデータベースを作ってもらう課題の時間とした。 (1)名前長,電話番号桁が可変、(2)データベースのサイズの配列が可変、(3)その両方が可変 という内容を、自分の理解度に応じてチャレンジしてもらう。

ただ、授業で見せた malloc の事例は、起動時点で配列サイズを入力してもらう方式で説明した。 しかし、現実のプログラムでは、それも不明なのが普通。

ということで、配列サイズが不足したら倍のサイズにコピー&拡大していく方式のサンプルを示す。

#include <stdio.h>
#include <stdlib.h>
// 配列のサイズを可変にするプログラム。                                         
// 開始時点で最大数も不明とする。                                               
int* array ;
int  asize ;
int  size = 0 ;

void init() {
  asize = 10 ;
  array = (int*)malloc( sizeof( int ) * asize ) ;
}

void append( int x ) {
  if ( array != NULL ) {
    if ( size >= asize ) {
      // 配列の大きさを2倍                                                      
      int* new_array = (int*)malloc(sizeof(int)*asize*2) ;
      if ( new_array != NULL ) {
        // 新しい配列にコピー                                                   
        for( int i = 0 ; i < asize ; i++ )
          new_array[ i ] = array[ i ] ;
        free( array ) ;
        array = new_array ;
        asize *= 2 ;
      }
    }
    array[ size ] = x ;
    size++ ;
  }
}

int main() {
  init() ;
  for( int i = 0 ; i < 100 ; i++ )
    append( i ) ;
  for( int i = 0 ; i < 100 ; i++ )
    printf( "%d\n" , array[ i ] ) ;
  return 0 ;
}
 

2017年6月

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

アーカイブ

Google

このブログ記事について

このページは、T-Saitohが2017年5月24日 11:23に書いたブログ記事です。

ひとつ前のブログ記事は「機械学習入門の講演会参加」です。

次のブログ記事は「情報構造論のテストの感想」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。