C言語学習ポータル(無料版) 学習コンテンツ つまずきとエラー 関数に配列を渡すと sizeof が変わる

🗃️ 配列

関数に配列を渡すと sizeof が変わる

どんなときに起きるか

main では sizeof(a) が 40 なのに、同じ配列を渡した関数の中では 8(32bit環境なら4)になります。gcc: warning: 'sizeof' on array function parameter 'a' will return size of 'int *' [-Wsizeof-array-argument]。

なぜそうなるのか

関数の引数に書いた int a[] は、実際には int *a に読み替えられます(配列からポインタへの成り下がり)。渡っているのは先頭の番地だけで、要素数の情報は失われています。

直し方・再発防止

要素数は別の引数で渡します: int sum(const int *a, size_t n)。sizeof a / sizeof a[0] が使えるのは、配列がまだ配列である場所(宣言したのと同じ関数の中)だけだと覚えておきます。

配列は身ひとつで旅に出る(4コマ漫画)
4コマで見る「配列は身ひとつで旅に出る」

アプリでしっかり学ぶ(無料・登録不要) つまずき一覧へ

同じ場面で起きやすいつまずき

配列の境界外アクセスたいてい何事もなく動きます。ときどき無関係な変数の値が勝手に変わり、たまに Segmentation fault…

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版(BOOTH)を見る

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版 / BOOTH