Im obigen Ausdruck ist nur das erste Element init mit 1. Wie können Sie alle Elemente mit einem Wert initialisieren, indem Sie ein zusammengesetztes Literal (nicht memset) verwenden?
Ich verwende GCC 4.2 unter Unix zum kompilieren.
Dies
%Vor%ist, wie Sie es tun.
Siehe Designated Initializers in den GCC-Dokumenten, in denen steht:
Um einen Bereich von Elementen auf denselben Wert zu initialisieren, schreiben Sie '[first ... last] = value'.
Nein, nur das erste Element wird auf 1.0 initialisiert. Der Rest wird initialisiert, aber auf 0,0 pro C-Standard. Weitere Beispiele finden Sie in der C faq .
Aus der Sprache Standard :
6.7.8 Initialisierung
...
10 Wenn ein Objekt mit automatischer Speicherdauer nicht explizit initialisiert wird, ist sein Wert unbestimmt. Wenn ein Objekt mit statischer Speicherdauer nicht explizit initialisiert wird, dann:
- Wenn es einen Zeigertyp hat, wird es mit einem Nullzeiger initialisiert; - Wenn es einen arithmetischen Typ hat, wird es initialisiert auf (positiv oder vorzeichenlos) Null; - Wenn es ein Aggregat ist, wird jedes Mitglied (rekursiv) gemäß diesen Regeln initialisiert; - Wenn es sich um eine Union handelt, wird das zuerst genannte Mitglied entsprechend diesen rekursiv initialisiert Regeln.
...
21 Wenn in einer geschweiften Klammer weniger Initialisierer vorhanden sind als Elemente oder Mitglieder eines Aggregats oder weniger Zeichen in einem Zeichenfolgenliteral, das zum Initialisieren eines bekannten Arrays verwendet wird Größe als es Elemente in der Anordnung gibt, soll der Rest des Aggregats sein implizit genauso initialisiert wie Objekte mit statischer Speicherdauer.
int arr[10]={1}
und int arr[10]={0}
erzeugen genau das gleiche Ergebnis - Element 0 wird auf das initialisiert, was zwischen den geschweiften Klammern angegeben ist, und die Elemente 1 bis 9 werden basierend auf den Absätzen 10 und 21 auf 0 initialisiert über. Nur erscheint , um anders zu sein, weil der explizite Initialisierer in einem Fall derselbe wie der implizite Initialisierer ist.
Nein, du musst sie alle machen. Diejenigen, die nicht angegeben werden, erhalten einen Standardwert, 0f
für einen Float.
Sie werden feststellen, dass eine einfache for
-Schleife den am besten wartbaren Code ergibt. Ich würde sicherlich nicht die Verwendung von memset
hier ermutigen.
Wie können Sie alle Elemente mit einem Wert initialisieren, indem Sie diese Formel verwenden (nicht memset)?
Mit einer Schleife. Mit memset
können Sie das nicht auf eine vernünftige und portable Art und Weise tun.
Es mag hässlich erscheinen, aber es ist die C-Art (und es wird hübscher, wenn Sie myArraySize
in etwas wie N
umbenennen). Wenn die Anzahl der Elemente fest ist, können Sie alternativ das Array aufzählen und optional die Größe weglassen:
Das Initialisieren eines Arrays in modernen Versionen von C initialisiert alle nicht angegebenen Einträge auf Null.
Um alle nicht angegebenen Einträge auf einen anderen Wert zu initialisieren, können Sie memset versuchen; das funktioniert jedoch nur sehr gut auf char-Arrays.
Für Nicht-Char-Arrays müssen Sie eine Schleife schreiben.