Wie initialisiert man alle Mitglieder eines Arrays auf denselben Wert?

Ich habe ein großes Array in C (nicht C++, wenn das einen Unterschied macht). Ich möchte alle Mitglieder auf den gleichen Wert initialisieren. Ich könnte schwören, dass ich einmal einen einfachen Weg kannte, dies zu tun. Ich könnte memset() in meinem Fall verwenden, aber gibt es nicht eine Möglichkeit, dies zu tun, die direkt in die C-Syntax eingebaut ist?

Lösung

Es sei denn, dieser Wert ist 0 (in diesem Fall können Sie einen Teil des Initialisierers weglassen weglassen und die entsprechenden Elemente werden mit 0 initialisiert), gibt es keinen einfachen Weg.

Übersehen Sie aber nicht die offensichtliche Lösung:

int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };

Elemente mit fehlenden Werten werden auf 0 initialisiert:

int myArray[10] = { 1, 2 }; // initialize to 1,2,0,0,0...

Damit werden alle Elemente mit 0 initialisiert:

int myArray[10] = { 0 }; // all elements 0

In C++ wird eine leere Initialisierungsliste ebenfalls jedes Element mit 0 initialisieren. Dies ist bei C nicht erlaubt:

int myArray[10] = {}; // all elements 0 in C++

Denken Sie daran, dass Objekte mit statischer Speicherdauer auf 0 initialisiert werden, wenn kein Initialisierer angegeben ist:

static int myArray[10]; // all elements 0

Und dass "0" nicht notwendigerweise "Alle-Bits-Null" bedeutet, so dass die Verwendung der obigen Methode besser und portabler als memset(). (Fließkommawerte werden auf +0 initialisiert, Zeiger auf Null, usw.)

Kommentare (17)

Sie können die ganze statische Initialisierer Sache wie oben beschrieben tun, aber es kann ein echter Knaller sein, wenn Ihr Array Größe ändert (wenn Ihr Array embiggens, wenn Sie nicht die entsprechenden zusätzlichen Initialisierer hinzufügen Sie Müll erhalten).

memset gibt Ihnen einen Laufzeit-Hit für die Arbeit, aber kein richtig gemachter Code ist immun gegen Änderungen der Array-Größe. Ich würde diese Lösung in fast allen Fällen verwenden, wenn das Array größer als, sagen wir, ein paar Dutzend Elemente war.

Wenn es wirklich wichtig wäre, dass das Array statisch deklariert wird, würde ich ein Programm schreiben, das das Programm für mich schreibt und es zum Teil des Build-Prozesses macht.

Kommentare (1)

Für die Initialisierung "normaler" Datentypen (wie int-Arrays) können Sie die Klammerschreibweise verwenden, allerdings werden die Werte nach dem letzten Wert auf Null gesetzt, wenn im Array noch Platz ist:

// put values 1-8, then two zeroes
int list[10] = {1,2,3,4,5,6,7,8};
Kommentare (0)