C言語の基礎
void f(int a[10]) {
printf("%zu\n", sizeof a);
}
int main(void) {
int b[10] = {0};
printf("%zu ", sizeof b);
f(b);
return 0;
}int は4バイト、ポインタは8バイトとする。上のプログラムを実行したときの出力として、正しいものはどれか。
- A10 10
- B40 8
- C40 40
答えと解説を見る
正解:B. 40 8
main の b は要素数10の int の配列なので、sizeof b は 10 × 4 = 40 バイトです。関数の引数を int a[10] と書いても、引数は配列ではなく int へのポインタ(int *a)として扱われ、f(b) では配列の先頭の番地だけが渡されます。そのため、f の中の sizeof a はポインタの大きさの8になります。gcc の -Wall ではこの sizeof に警告が出ます。関数の中で配列の要素数が必要なときは、要素数を別の引数として渡します。
- A. sizeof は要素数ではなく、バイト数を返します。
- B. 正しい。main では配列全体の40バイト、f ではポインタの8バイトです。
- C. 引数の a は配列ではなくポインタなので、f の中では40になりません。