2015-05-14 9 views
10

In diesem Code werden alle 100 Elemente von C.B auf Null initialisiert?Wird {0, 0} Array in der Struktur initialisieren?

struct A { int B[100]; int D; }; 
A C = {0, 0}; 

Es scheint zu funktionieren, aber Speicher nur im Voraus leer gewesen sein könnten.

+0

Dies ist kein Duplikat, können Sie den Unterschied zwischen der Initialisierung Array und Struct sehen? – exebook

+0

'A C = {0};' führt die Wertinitialisierung eines Aggregats durch, daher initialisiert value jedes Mitglied. In der Tat wird das Elementarray tatsächlich auf Null gesetzt. – vsoftco

+0

@vsoftco, sollte es stattdessen {{0}} sein? – exebook

Antwort

5

Die Linie

A C = {0, 0}; 

Führt value initialization des aggregateA. Gemäß der Norm können die Klammern für aggregierte Initialisierung weggelassen:

8.5.1 Aggregates [dcl.init.aggr]/12

Zahnspange kann in einer Initialisierer-Liste wie folgt elided . Wenn die Initialisierungsliste mit einer linken geschweiften Klammer beginnt, initialisiert die nachfolgende durch Kommas getrennte Liste von Initialisierungsklauseln die Elemente von ein Unteraggregat; es ist falsch, dass es mehr Initialisierungsklauseln als Mitglieder gibt. Wenn jedoch die Initialisierungsliste für ein Unteraggregat nicht mit einer linken Klammer beginnt, dann werden nur genug Initialisierungsklauseln aus der Liste genommen, um die Mitglieder des Unteraggregats zu initialisieren; Alle verbleibenden Initialisierungsklauseln sind übrig, um das nächste Mitglied des Aggregats zu initialisieren, von dem das aktuelle Unteraggregat ein Mitglied ist.

[Beispiel:

float y[4][3] = { 
    { 1, 3, 5 }, 
    { 2, 4, 6 }, 
    { 3, 5, 7 }, }; 

ist eine völlig verstrebten Initialisierung: 1, 3 und 5, um die erste Zeile des Arrays y initialisieren [0], nämlich y [0] [0], y [0] [1] und y [0] [2]. Ebenso initialisieren die nächsten zwei Zeilen y [1] und y [2]. Der Initialisierer endet früh und daher werden die Elemente von y [3] initialisiert, als ob sie explizit mit einem Ausdruck der Form float() initialisiert würden, dh mit 0.0 initialisiert werden. Im folgenden Beispiel werden Klammern in der Initialisiererliste weggelassen; jedoch ist die Initialisierer-Liste hat die gleiche Wirkung wie bei der vollständig-befestigten Initialisierer-Liste von dem obigen Beispiel

float y[4][3] = { 
    1, 3, 5, 2, 4, 6, 3, 5, 7 }; 

Der Initialisierer für y mit einer linken Klammer beginnt, aber die ein für y [0] tut nicht, daher werden drei Elemente aus der Liste verwendet. Ebenso werden die nächsten drei nacheinander für für y [1] und y [2] genommen. - Ende Beispiel]

Weiter

8.5.1 Aggregate [dcl.init.aggr]/7

Bei weniger Initialisierer-Klauseln in der Liste, als es members in aggregate, dann wird jedes nicht explizit initialisierte Element aus seiner Klammer-oder-Gleich-Initialisierung oder, wenn kein Klammer-oder-Gleich-Initialisierer ist, aus einer leeren Initialisierungsliste initialisiert.

In Ihrem Fall bedeutet dies, dass die ersten 0 zu B[0] und die zweiten 0-B[1] zugeordnet zugeordnet ist. Entsprechend zu 8.5.1/7 werden die restlichen Elemente Wert-initialisiert.

jedoch aus Gründen der Klarheit in diesem Fall sollten Sie A C = {{0}, 0}; verwenden, oder, besser

A C{}; // or A C = {}; 

Das einzige, was mich beunruhigt, ist ein bisschen die g ++ Warnung (-Wextra):

Warnung : fehlender Initialisierer für Member 'main() :: A :: D' [-Wissende-Feld-Initialisierer] AC {0,0};

Aber nach meiner Interpretation des Standards oben, sollten Sie in Ordnung sein und sollte initialisiert werden. Ich kann es auch mit einiger Platzierung getestet new und das Ergebnis als

erwartet wird
#include <iostream> 

int main() 
{ 
    struct A { int B[100]; int D;}; 
    A memory{}; 
    memory.D = 42; 
    std::cout << memory.D << std::endl; 

    // let's place something an A at the location of memory 
    A* foo = new (&memory) A{0,0}; 
    // line below outputs 0, so D is erased; not the case if A* foo = new (&memory) A; 
    std::cout << memory.D << std::endl; // outputs 0 
} 
+1

Ich habe die Frage bereits bearbeitet, also ist es nicht mehr {0}, sondern {0,0}. Auf diese Weise wird meine tatsächliche Betrachtung klarer. – exebook

Verwandte Themen