8

次の初期化を想定します。

char mystr[4] = "";

C99 標準は、空の文字列に初期化された文字配列が文字配列内のすべての要素を null バイトに初期化することを保証しますか? たとえば、規格は次のことを保証していmystr[2] == '\0'ますか?

これらの初期化はどうですか:

char myfoo[4] = { '\0' };
char mybar[4] = { 0 };

文字配列の最初の要素を明示的に設定すると、残りの要素が に暗黙的に初期化されることが保証されると確信していますが0、文字列リテラルの初期化により、配列へのコピーが発生するのではないかと考えています。残りの要素は初期化されていないままです。 \0

4

3 に答える 3

6

C 言語は、すべての集計初期化に対して「オール オア ナッシング」アプローチに従います。これは、集約の任意の部分に明示的な初期化子を提供しようとすると (その部分がどれほど小さいかに関係なく)、集約全体が初期化されることがすぐに保証されることを意味します。明示的な初期化子がない部分は、ゼロで初期化されます。

あなたの例では、配列全体がゼロで初期化されることが保証されています。構造体の初期化の場合、明示的に初期化されていないすべてのフィールドはゼロ値を取得します。

その原則の 1 つの結果は、C 言語では= { 0 }イニシャライザが慣用的なユニバーサル ゼロ イニシャライザとして機能することです。この言語= { value }ではスカラー オブジェクト初期化子の構文も使用できるため、任意のオブジェクトをすべてゼロの状態= { 0 }に初期化するために使用できます。

#define UNIVERSAL_ZERO { 0 }

double d = UNIVERSAL_ZERO;
char s[100] = UNIVERSAL_ZERO;
struct { int x, y, z; } xyz = UNIVERSAL_ZERO;
int *p = UNIVERSAL_ZERO;
于 2013-06-06T23:34:14.883 に答える