グローバル変数1のxが以下のように定義されていた場合に0に初期化されるのでしょうか?
int x;
int main(void)
{
/* 略 */
}
規格によると「0に初期化される」
「JIS X 3010:2003 プログラム言語C(2003).」 のp.95に以下の記載があります。
「b) そのオブジェクトの型が算術型の場合,(正又は符号無しの)0 に初期化する。」とあります。これによるとグローバル変数xは初期値0をもつようになります。実際、多くの汎用計算機ではプログラムを実行するたびにリロードされるので、グローバル変数xは初期値0をもつようになります。
組込みシステムでは
組込みシステムでは、グローバル変数の初期化には注意が必要です。通常、グローバル変数が割り当てられるメモリはプログラムがロードされるときに初期化されます2。プログラムがロードされないとグローバル変数は必ずしも「意図した」初期値をもちません。[1, 9.3.5節, pp.255-256]によると、多くの組込みシステムでは、実行ごとにプログラムはリロードされません。
But in many embedded systems, the program is not necessarily reloaded for each run.
したがって、グローバル変数xは必ずしも初期値0をもつと仮定できません。
ではどうするのが良い実践なのでしょうか? main関数がある場合は、main関数の本体において宣言のならびの直後にグローバル変数の初期値を代入する文を記述するのがより安全でしょう。
int x;
int main(void)
{
x = 0;
/* 略 */
}
参考文献
[1] Edward A. Lee and Sanjit A. Seshia, Introduction to Embedded Systems, A Cyber-Physical Systems Approach, Second Edition, MIT Press, ISBN 978-0-262-53381-2, 2017. https://ptolemy.berkeley.edu/books/leeseshia/