関数内で宣言した変数は、初期化せずに参照すると不定値が入っています。
関数の外で定義した変数は明示的に初期化しなくても、自動的に 0 で初期化されます。
今回は、そのような変数の初期化に関することを少し整理したいと思います。
【 いろいろな変数宣言 】
明示的に初期化しなかった場合の値を、変数定義の右にコメントで書いています。
プログラムの下で、整理します。
#include <stdio.h> //グローバル変数 //初期化しないと int gn; //0 int gnarray[5]; //0, 0, 0, 0, 0 char gstr[12]; //空文字列 //スコープを制限したグローバル変数 //初期化しないと static int sgn; //0 static int sgnarray[5]; //0, 0, 0, 0, 0 static char sgstr[12]; //空文字列 main() { //ローカルな自動変数 //初期化しないと int n; //不定値 int narray1[5]; //不定値 char str[12]; //不定値 //配列の一部を初期化 int narray2[5] = { 2, 1 }; //2, 1, 0, 0, 0 //ローカルな静的変数 //初期化しないと static int sn; //0 static int snarray[5]; //0, 0, 0, 0, 0 static char sstr[12]; //空文字列 }
ローカル変数はもちろんのこと、自動で初期化される変数でも、使う前には適切に値を入れて使う方がよいと思います。
scanf や代入などにより必ずデータを入れて使う場合を除き、明示的に初期化しておくと、見つけにくいバグや不要なトラブルを避けたり、処理内容を明確にすることができます。
(今回のクイズはありません)
shape_t stars[] = { { .name="ブラッド・ピット", .height=183.2, .weight=73.4, .bmi=0.0 } :