C Statische Array-Initialisierung - wie ausführlich muss ich sein?

7

Um ein int-Array mit allen Nullen zu initialisieren, muss ich folgendes verwenden:

%Vor%

Oder, wird das funktionieren:

%Vor%     
jgottula 29.08.2009, 21:06
quelle

4 Antworten

18
%Vor%

Das ist sehr gut:)

Beachten Sie Folgendes:

%Vor%

Nur das erste Element des Arrays wird mit der von Null verschiedenen Zahl initialisiert, während der Rest mit Nullen initialisiert wird.

    
AraK 29.08.2009, 21:07
quelle
27

Wenn Sie in C / C ++ nur das erste Element eines Arrays bekannter Größe mit einem Wert initialisieren, wird der Rest mit 0 gefüllt, also:

%Vor%

macht genau das, was Sie wollen.

Dies funktioniert auch für Strukturen:

%Vor%

initialisiert alle Mitglieder auf 0.

Der Standard (C99 - 6.7.8 / 12 - Initialisierung) sagt dies:

  

Wenn in einer geschichteten Liste weniger Initialisierer vorhanden sind als Elemente oder Mitglieder eines Aggregats oder weniger Zeichen in einem Zeichenfolgenliteral, das zum Initialisieren eines Arrays mit bekannter Größe verwendet wird, als Elemente im Array vorhanden sind, wird der Rest von Das Aggregat wird implizit genauso wie Objekte mit statischer Speicherdauer initialisiert.

In C erfordert die Grammatik, dass mindestens ein 'Zuweisungsausdruck' in den geschweiften Klammern steht. Ein 'Zuweisungsausdruck' kann viele Dinge von einer Konstante oder einem Identifizierer bis zu viel komplexeren Ausdrücken umfassen. Ein leerer String ist jedoch kein "Zuweisungsausdruck", also muss etwas zwischen den geschweiften Klammern stehen.

In C ++ erlaubt die Grammatik speziell den '{}' Initialisierer, also würde das folgende auch das Array null-initialisieren:

%Vor%

Es ist wahrscheinlich auch erwähnenswert, dass in C ++ die Einträge, die keinen spezifischen Initialisiererwert in der Initialisierungsliste haben, 'wertinitialisiert' oder 'default-initialisiert' sind, was von der Nullinitialisierung abhängig sein kann was die Konstruktoren für den Variablentyp sind und ob der Compiler dem C ++ 98-Standard oder dem C ++ 03-Standard folgt (dies ist wahrscheinlich der einzige Unterschied zwischen C ++ 98 und C ++ 03). Die ganze Situation mit der Initialisierung von Wert und Standard ist ziemlich kompliziert. Wenn Sie interessiert sind, sehen Sie diese Antwort: Machen die Klammern hinter dem Typnamen einen Unterschied zu neuen? .

Glücklicherweise scheint der Unterschied in der Praxis keine großen Probleme zu bereiten, wenn Sie jedoch darauf stoßen, würde es wahrscheinlich eine Weile Kopfkratzen verursachen, wenn Sie versuchen herauszufinden, wie das Verhalten wirklich sein sollte. Normalerweise denke ich nicht viel darüber nach - es macht meinen Kopf weh.

    
Michael Burr 29.08.2009 21:08
quelle
0

Alle Elemente, die nicht im Initialisierer erwähnt sind, werden mit dem Wert Null initialisiert, falls zutreffend.

So int foo [10] = {0}; ist in Ordnung, die restlichen nicht erwähnten Elemente sind auch 0

    
nos 29.08.2009 21:09
quelle
0

Wow, C scheint irgendwie einfach zu sein, aber selbst nach Jahren, in denen die Spezifikation zitiert wird, ist es erstaunlich, wie etwas Neues immer noch auftauchen kann.

Ich habe es gerade in der ersten Ausgabe-Spezifikation (ANSI / ISO 9899-1990) nachgeschlagen und, tatsächlich, wird der Rest eines automatischen Aggregats angegeben (6.5.7) "Wenn es weniger ... implizit initialisiert wird. .. ".

Also: Alles nicht-automatisch. Immer 0 (oder wie initialisiert) ob initialisiert oder nicht. Auto: vollständig initialisiert, wenn Sie überhaupt irgendwelche Elemente initialisieren, sonst nicht initialisiert.

    
DigitalRoss 30.08.2009 01:11
quelle

Tags und Links