例題 3任意個の整数を読み込み,入力順に配列 a へ格納しなさい. ただし,最初に個数を読み込むものとする.なお, 所定の個数を格納できるだけの配列をメモリ上に確保できない場合は 「メモリが足りません」 というエラーメッセージを出力して終了せよ. ※ 課題1, 課題2 では「任意個の」整数とはいっても, 256 個以下 という制限が付いていたが, ここでは真に任意個で考える. 方針・アルゴリズム特別なアルゴリズムは必要としないが, 配列をメモリ上に確保する定番のプログラムを紹介する.int 型で大きさ 10 の配列 a をメモリ上に確保する場合, 最も簡単なのは
しかし,この方法は あらかじめ配列の大きさが分かっている 場合にのみ有効である.
プログラムを実行するまで配列の大きさが不明な場合,
前もって十分大きな配列を用意しておくという手もあるが,無駄が多い.
【定番プログラム】
※ #include <stdio.h> の下に #include<stdlib.h> も書いておく.
なお,この方法によって確保したメモリは,
不要になった時点で明示的に解放するのが原則である.
●参考ページ - 情報工学実験 I(後期開講)の FAQ コーディング例1 /* 2 * プログラミング演習 第 12 回 3 * [例題 3] 4 * (C) 2006 Hirohisa AMAN <aman@cs.ehime-u.ac.jp, aman@computer.org> 5 */ 6 #include <stdio.h> 7 #include <stdlib.h> 8 9 int main(void){ 10 int i, N; 11 int* a; 12 13 /* 配列の大きさを読み込む */ 14 scanf("%d", &N); 15 16 a = (int*)calloc(N, sizeof(int)); 17 18 if ( a == NULL ){ 19 fprintf(stderr, "メモリが足りません\n"); /* printf("メモリが..."); でもよい */ 20 return 1; /* 強制終了 */ 21 } 22 fprintf(stderr, "メモリの確保に成功しました.\n"); 23 24 /* a[i] を読み込む */ 25 for ( i = 0; i < N; i++ ){ 26 scanf("%d", &a[i]); 27 } 28 29 /* a[i] を出力 */ 30 for ( i = 0; i < N; i++ ){ 31 printf("%d ", a[i]); 32 } 33 printf("\n"); 34 35 free(a); /* メモリの解放 */ 36 37 return 0; 38 }
※左端の数字は行番号であり,ソースコードには含まれない点に注意!
コンパイル & 実行例$ gcc example12_3.c [Enter] $ ./a.out [Enter] 10 [Enter] メモリの確保に成功しました. 1 2 3 4 5 6 7 8 9 10 [Enter] 1 2 3 4 5 6 7 8 9 10 $ ./a.out [Enter] 1000000000 [Enter] メモリが足りません |