Was passiert mit Feldern, die nicht von einem designierten Initialisierer benannt wurden?

Lesezeit: 1 Minute

In C99 (und nicht in C++) ist es möglich, Strukturen mit dieser Syntax zu initialisieren:

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

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

Was passiert mit den nicht spezifizierten Feldern?

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

    – Torak

    30. Juli 2010 um 18:45 Uhr


Sie werden auf Null gesetzt. Aus dem C99-Standard §6.7.8 (Initialisierung)/21,

Wenn eine in geschweiften Klammern eingeschlossene Liste weniger Initialisierer enthält als Elemente oder Mitglieder eines Aggregats oder weniger Zeichen in einem Zeichenfolgenliteral, das zum Initialisieren eines Arrays bekannter Größe verwendet wird, als Elemente im Array vorhanden sind, der Rest des Aggregats wird implizit genauso initialisiert wie Objekte mit statischer Speicherdauer.

  • Genau das, was ich wissen wollte, komplett mit Standardangebot. Vielen Dank!

    – Matt Tischler

    30. Juli 2010 um 18:49 Uhr

  • @Matt Joiner: Gab es jemals Zweifel? Oh, und der Vollständigkeit halber siehe §6.7.8 (Initialisierung)/10, der effektiv besagt, dass ein solcher statischer Speicher NULL/0-initialisiert ist.

    – Torak

    30. Juli 2010 um 18:52 Uhr

  • Eine nützliche Folge dieser Tatsache ist die { 0 } ist ein universeller Nullinitialisierer, der für jeden Aggregattyp verwendet werden kann (und tatsächlich für jeden Typ überhaupt, IIRC, obwohl einige Compiler möglicherweise Warnungen ausgeben, wenn er für einfache Typen verwendet wird).

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    30. Juli 2010 um 23:30 Uhr

  • @torak Ich denke, dass der Floatpoint für die statische Dauer auf +0 initialisiert wird, daher lautet der ursprüngliche Satz in C99 §6.7.8 “if it has arithmetic typees wird auf initialisiert (positive or unsigned) zero;”, vielleicht bin ich etwas pedantisch :)?

    – Allan-Ruine

    28. Mai 2012 um 7:53 Uhr


1206420cookie-checkWas passiert mit Feldern, die nicht von einem designierten Initialisierer benannt wurden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy