質問: dataのサイズが3であることを知りたいのですが、 **main()**では**3**になってくれるのに、 **student_input()**では**0**になってしまいます。 **1.**student_input(data)で渡しているdataは 配列の先頭のアドレスであるため、 student型への&data[0]の指すアドレスを渡している。 という認識なので、こういう動作になるのでしょうか。 **2.**student_input(data, 3)として、配列のサイズ3を渡す以外に、 student_input()の中だけでdata配列のサイズを知りえる方法はありますか。 --- **3.**下記の部分ですが、他のname, sexはエラーになるのに、 yearだけ、なぜエラーになるのでしょうか。 > > //scanf("%d", data[i].year); // エラーになる > > scanf("%d", &data[i].year); // エラーにならない > > > --- ``` #include #include typedef struct student_tag { char name[64]; int year; char sex[64]; } student; int student_input(student data[]); void student_print(student data[]); int main(void) { student data[3]; printf("%d\n", sizeof(data)/sizeof(data[0])); // 3になる student_input(data); student_print(data); return 0; } int student_input(student data[]) { printf("%d\n", sizeof(data)/sizeof(data[0])); // 0になる int i; char txt; for (i=0; i
回答: > > 1.student_input(data)で渡しているdataは > > 配列の先頭のアドレスであるため、 > > student型への&data[0]の指すアドレスを渡している。 > > という認識なので、こういう動作になるのでしょうか。 > > > そうですね。 配列の先頭要素へのポインタが渡っています。 sizeofで配列のサイズを取り出せるのは、実は例外的な挙動です。 sizeofが演算子であって関数では無いことの証左でもあります。 > > 2.student_input(data, 3)として、配列のサイズ3を渡す以外に、 > > student_input()の中だけでdata配列のサイズを知りえる方法はありますか。 > > > 無いです。 ただし、配列をラップした構造体で似たようなことはできます。 > > 3.下記の部分ですが、他のname, sexはエラーになるのに、 > > yearだけ、なぜエラーになるのでしょうか。 > > > > > > > //scanf("%d", data[i].year); // エラーになる > > > > scanf("%d", &data[i].year); // エラーにならない > > > > > > > > > name, sex はchar配列です。 関数に渡されるときはやはり先頭要素へのポインタに読み替えられます。 一方yearはint型の変数なので、アドレスを明示的に取得しなければなりません。