PROG 13.1 配列の動的生成 - 要素数指定 (p. 95)

問題

[実行結果]
length of data :3 (配列の長さ、データの長さを入力)
0 :number :4 (各データを入力)
1 :number :5
2 :number :6
0 : 4 (3つ入力しおえたところで、入力は終了。続いて格納データを一気に出力)
1 : 5
2 : 6

[配列の確保] [その他]
  • 配列の確保は、要素のサイズのメモリを連続確保すること (よくわかるC pp.83-84: 教科書では文字列を扱う配列の例)
  • メモリの動的確保にはmalloc (memory allocation; メモリの確保)を利用する。
  • 以下の例を確認のこと。今回の場合は、要素の型はintをnx個連続確保
  • xは、確保された先頭のアドレス
int *x;

x = (int *)malloc(sizeof(int)*nx); /* 各領域、(int *)のアドレスと型を整えること。型変換はキャストという。(int *)の部分はプログラムごとに異なる */
  • 先頭のアドレスは、配列にもポインタ演算にも利用できる(よくわかる C p.83-84)
  • 一度に連続した領域を確保する場合はmallocのほか、callocを使うことが多い。

[プログラム]

#include <stdio.h>
#include <stdlib.h>


int main (void) {
   int *x;
   int i,nx;

   printf("length of data :"),
   scanf("%d", &nx);

   x = (int *)malloc(sizeof(int)*nx);

   i = 0;
   while (i < nx) {
     printf("%d :number :", i);
     scanf("%d", (x+i));
     i++;
   }

   /* 出力 x[i]と配列のように扱う */
   i = 0;
   while (i < nx) {
     printf("%d : %d \n",i, x[i] );
     i++;
   }

   /* 以下、ポインター演算による出力も行え */

   i = 0;
   while (i < nx) {
     printf("%d : %d \n",i, *(x + i));
     i++;
   }


   free(x); /* メモリの解放 忘れないこと */

   return (0);
}