2011-06-29 14 views
1

私は、バイナリ(BSSセクション)の初期化されていない変数セクションに静的変数を入れて、0に初期化しても安全だと考えています。変数は名前のない名前空間で0に自動初期化されますか?

しかし、私は名前のない名前空間で定義された関数を持っています。この関数の中には、0に明示的に初期化されずに宣言されたchar配列があります。これは0に自動初期化されますか? staticとして宣言されていない名前のない名前空間で定義された変数はどうですか?静的関数の局所変数はどうですか?

答えて

1

あなたのために初期化/実行されていることに依存することはありません。物事が変わるかもしれないので、あなたは気づかずにキャッチされるので、ちょうど初期化を常に行います。

1

変数を自動的に任意の値に初期化することはできません。場合によってはこれが絶えず起こっても、コンパイラを変更するだけで全く異なる結果が生まれる可能性があります。最も安全なのは、すべての変数を常に値を初期化することです。 static variablesも初期化する必要があります。変数が名前空間に属しているということは重要ではありません。

2

関数のローカル変数は、関数が匿名の名前空間、静的なもの、その他のいずれであるかにかかわらず、自動的にゼロに初期化されません。これは、関数内のローカル変数が静的変数ではないためです。ローカル変数に静的記憶期間を持たせるには、明示的にそれをstaticとマークする必要があります。

int foo; // static storage duration (because it's global) automatically zero-initialized 

static int foo2; // static storage duration (because it's global) automatically zero-initialized. The static keyword just gives the name 'foo2' internal linkage and has nothing to do with static storage duration. 

namespace { 

    int foo; // static storage duration, automatically zero-initialized 

    void bar() { 
     int f; // local variable, not automatically zero-initialized 

     static int g; // static storage duration (because of the keyword static), automatically zero-initialized 
    } 
} 
関連する問題