2017-01-27 7 views
0

Dies scheint wie ein Loch in meinem Wissen. Soweit ich weiß, in C99, wenn Sie ein einzelnes Element eines struct und keine anderen initialisieren, werden die anderen Null initialisiert. Initialisiert der folgende Code Null alle Mitglieder eines struct obwohl?Leere Initialisierung eines Array von Strukturen in C99

Update: Es gibt einige Kommentare, die darauf hinweisen, dass diese Syntax eine Erweiterung ist. Wenn dies der Fall ist, gibt es einen Weg, der rein C99-konform ist?

+1

, die eine Erweiterung von gcc ist. – BLUEPIXY

Antwort

4

Per C11, Kapitel §6.7.9, Initialisierung Syntax (aus Gründen der Vollständigkeit, gleicht in Kapitel §6.7 erwähnt.8 in C99)

Initialisierer:

            Zuweisungsausdruck
            {Initialisierer-Liste}
            {Initialisierer-Liste}

Initialisierer-Liste:
            Bezeichnung opt initializer
            Initialisierer-Liste Bezeichnung opt initializer

Bezeichnung:
            Bezeichner-list =

Bezeichner-Liste:
            Bezeichner
       Bezeichner  Bezeichner-Liste

Bezeichner:
            [konstanter Ausdruck]
           . Bezeichner

Das bedeutet, dass die Initialisierungsliste für geschweifte Klammern mindestens ein Initialisierungselement (Objekt) haben sollte.

In Ihrem Code, der leere Initialisiererliste

some_struct_t mystructs[100] = {}; //empty list 

keine gültige reine C-Syntax ist; Es ist eine Compiler-Erweiterung.

Sie benötigen ein einzelnes Element in der Liste zu erwähnen, es standardkonform zu machen, wie

some_struct_t mystructs[100] = {0}; 

, die die Kriterien erfüllen, von Ziffer 21 der gleichen Norm (en),

Wenn in einer geschweiften Liste weniger Initialisierer vorhanden sind als Elemente oder Elemente eines Aggregats, oder weniger Zeichen in einem Zeichenfolgenliteral, das zum Initialisieren eines Arrays mit bekannter Größe verwendet wird, dann gibt es el. ements in dem Array, der Rest des Aggregats wird implizit die gleiche wie Objekte initialisiert werden, die statische Lagerdauer aufweisen.

Also, in diesem Fall haben Sie eine explizite 0 und verbleibende implizite Null-Initialisierung (oder ähnlich).

+0

Ich vermute, ich bin hier seine wählerisch, aber das von C11 ist, dann ist dies das gleiche in C99? – Joe

+0

@Joe C war schon immer so. Der einzige Unterschied zwischen C-Standardversionen ist, dass C99 designierte Initialisierer als eine Form der expliziten Initialisierung einführte. – Lundin

4

Weil es Array Initialisierung, müssen Sie

some_struct_t mystructs[100] = { 0 }; // ensure all array elements (struct) being zero initialisation 
4

Für Structs/Unions (und Arrays) gibt es eine Regel, die besagt, dass, wenn es teilweise initialisiert wird, der Rest der Elemente, die nicht explizit vom Programmierer initialisiert wurden, auf Null gesetzt wird.

Also, indem Sie some_struct_t mystructs[100] = {0}; eingeben, sagen Sie dem Compiler, foo explizit auf Null setzen. Und dann wird der Rest der Strukturelemente implizit auf Null gesetzt.

Dies hat nichts mit C99 zu tun, funktioniert aber für alle C-Standardversionen. In C99/C11 hätte ein designierter Initialisierer {.foo=0} das gleiche Ergebnis erzielt.

Verwandte Themen