2016-04-30 4 views
1

Um einen 2D-Array zu initialisieren, in der Regel können wir es wie folgt tun:Unexpected Initializing Ergebnis von 2D-Array

int matrix[3][4] = { {1,1,1,1}, {2,2,2,2}, {3,3,3,3} }; 

Aber, wie ich es mit verschiedenen Kombinationen testet die folgenden Codes haben aus meiner Erwartung kompilieren :

int matrix[3][4] = {1,2,3,4,5,6,7}; 

Wenn ich die Ausgabe in einer 2D-Tabellenform drucken, erhalte ich:

1,2,3,4, 
5,6,7,0, 
0,0,0,0, 

Ich verstehe, warum der Rest der Werte Nullen sind.

Meine Frage ist: Ist dies eine der legitimen Möglichkeiten, 2D-Array zu initialisieren, indem man annimmt, dass die Zahlen, die die Grenzen einer Zeile überschreiten, immer zur nächsten Zeile "fließen"? Oder ist das eine weitere Falle, die ich in C++ vermeiden sollte?

+1

Das ist völlig legitim. Es ist seit der Standardisierung Teil von C und C++. Obwohl Sie vielleicht denken, dass die explizitere Version einfacher zu lesen ist. –

+0

@AlanStokes Danke für Ihre Antwort, ich war irgendwie überrascht zu wissen, dass es zwar legitim ist, weil ich dachte, es kompiliert, weil C++ die Grenzen nicht überprüft, und die Nummer nur auf dem nächsten verfügbaren Speicher sitzen. Oder kann ich das sagen, da der nächste verfügbare Speicher auch als Teil des Arrays "reserviert" ist. Es ist in Ordnung, dies zu tun? – user3437460

+1

@ user3437460 Wie kann der Compiler einen der Werte auf 0 setzen, wenn er die Grenzen nicht überprüft? Wenn Sie die Grenzen überschreiten, führt dies zu einem Compilerfehler. – user6276096

Antwort

6

Ja, das ist völlig in Ordnung. Zitiert the unofficial cppreference:

die Streben um die verschachtelten Initialisierer Listen kann werden elided (weggelassen), wobei in diesem Fall so viele Initialisierer Klauseln wie nötig sind verwendet jedes Mitglied bzw. Element des entsprechenden Unteraggregats zu initialisieren, und die nachfolgende Initialisierungsklauseln werden verwendet, um die folgenden Elemente des Objekts zu initialisieren .

Und:

Wenn die Anzahl der Initialisierer Klauseln geringer ist als die Anzahl der Mitglieder oder Initialisiererliste vollständig leer ist, werden die übrigen Mitglieder durch leere Listen initialisiert, die Wert-Initialisierung durchführt .

Und Wert Initialisierung int setzt es auf 0.