2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C言語でグローバル変数は必ず初期化されるか

Last updated at Posted at 2020-08-05

グローバル変数1のxが以下のように定義されていた場合に0に初期化されるのでしょうか?

int x;

int main(void)
{
    /* 略 */
}

規格によると「0に初期化される」

「JIS X 3010:2003 プログラム言語C(2003).」 のp.95に以下の記載があります。

スクリーンショット 2020-08-05 10.32.51.png

「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/

  1. 外部変数

  2. 一般にbssセクションに割り当てられるメモリはこのような初期化が行われます。

2
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?