構造体と配列

C

構造体変数を配列として考えることを構造体配列と呼びます。

#include <stdio.h>
  
int main(void)
{
      
    //構造体配列の宣言(構造体テンプレートと、構造体配列を別々に書く場合)
    struct data{
        int no;
        char name[10];
        int age;
    };
    
    struct data list1[10];
    
    //構造体配列の宣言(構造体テンプレートと、構造体配列を同時に書く場合)
    struct data2{
    	int no;
    	char name[10];
    	int age;
    } list1[10];
    
    //構造体配列を初期化する場合(各々の配列内に値をセットしている)
    struct data2 list1[10] = {
    	{1, "testA", 10},
    	{2, "testB", 20},
    	{3, "testC", 32},
    	{4, "testD", 41}
    };
    
    //↑の例では、list1[10]と定義しているので、10個分の構造体配列を持たせることができる
    
    
    return 0;
}

上記プログラムを実行しただけでは、画面上にはなにもおこりません。
そこで、構造体配列の中身を参照する記述を書いてみます。

#include <stdio.h>
  
int main(void)
{
      
    //構造体配列の宣言(構造体テンプレートと、構造体配列を別々に書く場合)
    struct data{
        int no;
        char name[10];
        int age;
    };
    
    struct data list1[10]; //構造体配列の宣言
    
    //構造体配列の宣言(構造体テンプレートと、構造体配列を同時に書く場合)
    struct data2{
    	int no;
    	char name[10];
    	int age;
    } list1[10];  //構造体配列の宣言(同時に)
    
    //構造体配列を初期化する場合(各々の配列内に値をセットしている)
    struct data2 list1[10] = {
    	{1, "testA", 10},
    	{2, "testB", 20},
    	{3, "testC", 32},
    	{4, "testD", 41}
    };
    
    //↑の例では、list1[10]と定義しているので、10個分の構造体配列を持たせることができる
    
    
    //構造体配列の中身を参照する記述
    //方法1
    int i;
    for (i = 0; i <10; i++ ) {
    	printf("%d %s %d \n", list1[i].no, list1[i].name, list1[i].age);
    }
    
    printf("-----------\n");
    
    //方法2
    int j;
    struct data2 *sp = list1;
    for (j = 0; j < 10; j++ ) {
    	printf("%d %s %d \n", list1[*(sp+j)].no, list1[*(sp+j)].name, list1[*(sp+j)].age);
    }

    printf("-----------\n");

    //方法3
    struct data2 *sp;
    for (sp = list1; sp != list1 + 10; sp++ ) {
    	printf("%d %s %d \n", sp->no, sp->name, sp->age);
    }

    return 0;
}

上記を実行した結果、方法2の結果がなぜか下記のようになる。

1 testA 10
2 testB 20
3 testC 32
4 testD 41
0  0
0  0
0  0
0  0
0  0
0  0
-----------
2 testB 20      //出力の開始がおかしい(2つめからになっている)
3 testC 32
4 testD 41
0  0            //←ここの値がおかしい
1 testA 10
1 testA 10
1 testA 10
1 testA 10
1 testA 10
1 testA 10
-----------
1 testA 10
2 testB 20
3 testC 32
4 testD 41
0  0
0  0
0  0
0  0
0  0
0  0

なぜなのか、、調査中

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です