上のプログラム prog10.c では、 N の定義を書き変えることでベクトルの次元を変えることができるが、 (C99以前のCの規格では) プログラムの実行中にベクトルの次元を選ぶことはできない。 そうするには malloc() のような関数を利用して、 動的にメモリーを確保する必要がある。 ポインターの扱いにも慣れる必要がある。
/*
* prog11.c --- 「動的な配列」をポインターで実現する
* コンパイルするには、たとえば gcc -o prog11 prog11.c
*/
#include <stdio.h>
#include <stdlib.h> /* malloc() の宣言 */
/* n 次元のベクトル x, y の内積を計算する */
double inner_product(double *x, double *y, int n)
{
int i;
double s;
s = 0.0;
for (i = 0; i < n; i++)
s += x[i] * y[i];
return s;
}
int main(void)
{
int i, N;
double *a, *b;
printf("二つのベクトルの内積を計算します。\n");
printf("次元を入力してください: "); scanf("%d", &N);
a = malloc(sizeof(double) * N);
b = malloc(sizeof(double) * N);
if (a == NULL || b == NULL) {
fprintf(stderr, "ベクトルを記憶するメモリーの確保に失敗しました。\n");
exit(1);
}
printf("一つ目のベクトル a の入力\n");
for (i = 0; i < N; i++) {
printf(" %d 番目の成分=", i + 1); scanf("%lf", &a[i]);
}
printf("二つ目のベクトル b の入力\n");
for (i = 0; i < N; i++) {
printf(" %d 番目の成分=", i + 1); scanf("%lf", &b[i]);
}
printf("内積=%g\n", inner_product(a, b, N));
/* a, b のために確保したメモリーを解法する
* プログラムの最後だからなくても良いが解放の仕方の説明用 */
free(a); free(b);
return 0;
}