11.構造体

11-7. 構造体型配列

◇構造体型配列

 構造体を配列として宣言すると構造体型配列(つまり構造体の配列)を作ることができます。
 早速例をあげてみます。

#include<stdio.h>

struct st1{
    int i,j;
    char c;
};

main()
{
    int x;
    struct st1 sArr[3] = {
        {1,2,'A'},
        {3,4,'B'},
        {5,6,'C'}
    };
    for(x=0;x<3;x++)
    printf("%d %d %c \n",sArr[x].i,sArr[x].j,sArr[x].c);
    printf("Size=%dByte\n",sizeof(sArr));
    return;
}

/* 結果
1 2 A
3 4 B
5 6 C
Size=36Byte
*/

 ざっと説明しますと、定義は今まで通りですが、宣言時に配列として宣言すると構造体型配列ができあがります。

宣言と同時に値を初期化しているのでメモリマップは大体次のようになります。

+——–+
sArr[0].i| 1 | int型
+——–+
.j| 2 | int型
+—-+—+
.c| ‘A’| char型
+—-+—+
sArr[1].i| 3 | int型
+——–+
.j| 4 | int型
+—-+—+
.c| ‘B’| char型
+—-+—+
sArr[2].i| 5 | int型
+——–+
.j| 6 | int型
+—-+—+
.c| ‘C’| char型
+—-+

イメージ的にはこんな感じで結構です。
 ただし、構造体のメモリ確保については処理系によってサイズが異なりますので上図が絶対というわけではありませんので悪しからず。

ちなみにsArrは36バイトと出ました。
36bitのコンパイラなのでintは4バイトです。
(4+4+1)*3 = 27バイト利用するわけですが実際は36バイト確保されました。

その差は9バイトです。3で割っても3バイトということはそれだけ使われない領域が存在していることを意味します。

+—————-+
sArr[0].i| 1 | int型
+—————-+
.j| 2 | int型
+—-+———–+
.c| ‘A’|***********| char型
+—-+———–+
sArr[1].i| 3 | int型
+—————-+
.j| 4 | int型
+—-+———–+
.c| ‘B’|***********| char型
+—-+———–+
sArr[2].i| 5 | int型
+—————-+
.j| 6 | int型
+—-+———–+
.c| ‘C’|***********| char型
+—-+———–+

こちらのコンパイラではこのようになっていて*のところが使わない領域として確保されているようです。
 もっと詳しく調べる必要のある方はメンバのアドレスを標準出力に出して確かめてみてください。

 なお、構造体型配列のメンバにアクセスするときも特に今までと変わりが無いのでそのままで大丈夫です。

Arr[0].j 構造体型配列 Arr の要素 0 のメンバ j にアクセス