2010年6月7日月曜日

二次元配列を動的に確保

mallocを使って二次元配列を動的に確保しようと考えた事が無いでしょうか? これが簡単にできるコードを紹介します。 以下のサンプルでは、動的確保した二次元配列を使用しています。


 #include<stdio.h>
#include <stdlib.h>
int main(void){

/*ダイナミックに配列を宣言するサンプル*/

int **array;
int i,j,k;
int iMax;

/*行の最大値を取得*/
printf("Max=");
scanf("%d",&iMax);

/*行領域をダイナミックに確保*/
array = (int**)malloc(sizeof (int)*iMax);

/*列領域をダイナミックに確保*/
for(i=0 ; i<iMax ; ++i){
    array[i] = (int*)malloc(sizeof(double)* 3);
}

/*-------------------------------------------*/



/*配列の中に適当な数値を代入する*/
k = 1;
for(i=0 ; i < iMax ; ++i){
  
    for(j=0 ; j<3 ; j++){
      
        array[i][j] = k;
        ++k;
    }
}

/*配列の中身を表示する*/
for(i=0 ; i < iMax ; ++i){
  
    for(j=0 ; j<3 ; j++){
      
        printf("%d,",array[i][j]);
    }
}

/*体裁を整える改行、絶対に必要なわけではない*/
printf("\n");



/*-------------------------------------------*/

/*mallocで確保したメモリは使い終わったらシステムに返すのがマナーです*/
for(i=0 ; i<iMax ; ++i){
    free(array[i]);
}
free(array);

return 0;
}

1 件のコメント:

  1. それは二次元配列じゃありません。
    int array2[2][2];
    と等価なはずの配列を記事の方法で確保したとしても
    int *a;
    a=&array[0][0];
    とした後
    &a[2+1]

    &array[1][1]
    は(PCのコンパイラで大抵の場合)同じ実体ではありません。

    a=&array2[0][0];
    ならば
    &a[2+1]

    &array2[1][1]
    は同じ実体になります。

    返信削除