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バイトとする。上のプログラムを実行したときの出力として、正しいものはどれか。

  1. A10 10
  2. B40 8
  3. 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になりません。
この分野を解く 分野ページへ

C言語の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

C言語の基礎のほかの問題

  1. int は4バイトとする。上のコードを実行したときの出力として、正しいものはどれか。
  2. 文字列を入れた char の配列について、上のコードを実行したときの出力として、正しいものはどれか。
  3. 上の宣言の後に、ア「p = t;」、イ「*p = 'x';」、ウ「q = t;」、エ「*q = 'x';」のどれかを書く。コンパイルエラーになるものの組み合わせはどれか。
  4. 関数ポインタの配列を使った上のプログラムを実行したときの出力として、正しいものはどれか。
  5. fill と use は別に定義された関数とする。上の関数の問題点として、正しいものはどれか。