プログラムの実行中にサイズを選べるようにするには、 行列を double へのポインターのポインターとして表現し、 malloc() を使って動的にメモリーを確保することになるが、 手順はやや複雑になる。 ポインターに慣れていないと難しいかもしれない。
/*
 * prog12b.c --- ポインターのポインターで行列を実現
 */
#include <stdio.h>
#include <stdlib.h>
/* doubleへのポインターをvector, vectorへのポインターをmatrixとする */
typedef double *vector;
typedef vector *matrix;
/* matrix データを表示する */
void display(int m, int n, matrix A)
{
  int i, j;
  for (i = 0; i < m; i++) {
    for (j = 0; j < n; j++)
      printf("%7.2f ", A[i][j]);
    printf("\n");
  }
}
/* 行数、列数を指定して matrix を確保 (エラー・チェックつき) */
matrix new_matrix(int m, int n)
{
  int i;
  vector ap;
  matrix a;
  if ((a = malloc(sizeof(vector) * m)) == NULL) {
    return NULL;
  }
  if ((ap = malloc(sizeof(double) * (m * n))) == NULL) {
    free(a);
    return NULL;
  }
  for (i = 0; i < m; i++)
    a[i] = ap + i * n;
  return a;
}
/* matrixデータを解放 */
void free_matrix(matrix a)
{
  free(a[0]);
  free(a);
}
int main(void)
{
  int i, j, m, n;
  matrix a, b, c;
  m = 2; n = 2;
  a = new_matrix(m, n);
  b = new_matrix(m, n);
  c = new_matrix(m, n);
  if (a == NULL || b == NULL || c == NULL) {
    fprintf(stderr, "メモリーの確保に失敗しました。\n");
    exit(1);
  }
  /* a の値の設定 */
  a[0][0] = 1; a[0][1] = 2;
  a[1][0] = 3; a[1][1] = 4;
  /* bの入力 */
  for (i = 0; i < m; i++)
    for (j = 0; j < n; j++) {
      printf("b[%d][%d]=", i, j);
      scanf("%lf", &b[i][j]);
    }
  /* c:=a+b */
  for (i = 0; i < m; i++)
    for (j = 0; j < n; j++)
      c[i][j] = a[i][j] + b[i][j];
  /* a,b,c を表示 */
  printf("a=\n"); display(m, n, a);
  printf("b=\n"); display(m, n, b);
  printf("c=\n"); display(m, n, c);
  return 0;
}