(c言語)2次元配列を作る(malloc対応)

状況

2次元配列の仕組みの振り返り

素数nに対してmallocをどのようにしたらできるのかの備忘録

1次元配列

void main(){
  int i;
  int a[2]={1,2};
  for(i=0;i<2;i++){
    printf("a[%d]=%d\n",i,a[i]); 
  }  
}
a[0]=1
a[1]=2

2次元配列

int i,j;
  int a[2][3]={{1,2,3},{4,5,6}};//2×3の配列
  for(i=0;i<2;i++){//行
    for(j=0;j<3;j++){//列
      printf("a[%d][%d]=%d\n",i,j,a[i][j]); 
    }
  }
a[0][0]=1
a[0][1]=2
a[0][2]=3
a[1][0]=4
a[1][1]=5
a[1][2]=6

少し表示を変えると,

1,2,3
4,5,6

つまり、書く時の書き方を変えてみる。

  int a[3][3]={{1,2,3}
              ,{4,5,6}};

少し見やすくなったかな?、、

ここまででわかったこと

a[i][j] iは行を示すjは列を示す。

mallocによる任意の2次元配列

やり方は2通り 1. 1回のmallocですべての領域を確保する 2. 2回mallocする

イメージは以下のとおりである。

それではコードを見てみよう。

void main(){
  int *a;
  int i,j;
  //やり方1//
  printf("--method[1]--\n");
  a=(int*)malloc(sizeof(int)*(2*2));//2*2の配列を作る
  for(i=0;i<4;i++){
    a[i]=i;
  }
  for(i=0;i<4;i++){
    printf("%d",a[i]);
    if(i==2-1){
      printf("\n");//見やすいように
    }    
  }
  printf("\n");
free(a);
}
  //やり方2//
void main(){
  printf("--method[2]--\n");
  int **aa;
  aa=(int**)malloc(sizeof(int)*2);//行2の配列
  for(i=0;i<2;i++){
    aa[i]=(int*)malloc(sizeof(int)*3);//列3の配列
    
  }
  for(i=0;i<2;i++){//初期化(配列に0を代入)
    for(j=0;j<3;j++){
      aa[i][j]=i+j;
    }
  }
  for(i=0;i<2;i++){//行
    for(j=0;j<3;j++){//列
      printf("%d",aa[i][j]);//出力
    }
    if(j!=3-1){//見やすいように
      printf("\n");
    }
  }
free(aa);
}

結果は以下のとおりである。

--method[1]--
01
23
--method[2]--
012
123

まとめ

  • しっかりと行列を考えてあげることで計算ができる。
  • n次元行列に対しては、2のやり方だと、最初にaaをポインタのポインタのポインタの...にする必要があるので不向き
  • よって、1のやり方で、0番目を0のx方向、1番目を0のy方向,2番目を0のz方向...のように組み合わせるのがベストである気がする。