2010-07-30 5 views
13

In C99 (und nicht in C++), dann ist es möglich, Strukturen mit folgenden Syntax zu initialisieren:Was passiert mit Feldern, die nicht von einem bestimmten Initialisierer benannt wurden?

struct info 
{ 
    char name[8+1]; 
    int  sz; 
    int  typ; 
}; 

struct info arr[] = 
{ 
    [0] = { .sz = 20, .name = "abc" }, 
    [9] = { .sz = -1, .name = "" } 
}; 

Was geschieht mit den nicht näher bezeichnen Felder?

+2

Ich bin mir ziemlich sicher, dass sie 0 initialisiert sind. Aber ich bin mir auch sicher, dass jemand anderes schneller sein wird, um den Teil der C99-Spezifikation zu finden, der es so macht. ... Und ich hatte Recht! – torak

Antwort

23

Sie sind auf Null gesetzt. Von der C99-Standard § 6.7.8 (Initialisierung)/21,

Wenn weniger Initialisierer in einer geschweiften Klammern stehenden Liste sind als es Elemente oder Elemente eines Aggregats sind, oder weniger Zeichen in einem String-Literal verwendet initialisieren Sie ein Array bekannter Größe als es Elemente im Array gibt, der Rest des Aggregats soll implizit genauso wie Objekte mit statischer Speicherdauer initialisiert werden.

+0

Genau das, was ich wissen wollte, komplett mit Standardzitat. Vielen Dank! –

+3

@Matt Joiner: Gab es jemals Zweifel? Oh, und zur Vollständigkeit siehe §6.7.8 (Initialisierung)/10, die effektiv besagt, dass solch ein statischer Speicher NULL/0 initialisiert ist. – torak

+2

Eine nützliche Konsequenz dieser Tatsache ist, dass '{0}' ein universeller Zero-Initialisierer ist, der für jeden Aggregattyp (und eigentlich jeden Typ, IIRC) verwendet werden kann, obwohl einige Compiler Warnungen ausgeben, wenn sie für einfache Typen verwendet werden). –

Verwandte Themen