Wie initialisiere ich ein Array in C auf 0?

170

Ich brauche ein großes Null-Array in C als globales. Gibt es eine Möglichkeit, dies zu tun, außer zu tippen?

char ZEROARRAY[1024] = {0, 0, 0, /* ... 1021 more times... */ };

?

Claudiu
quelle
26
char ZEROARRAY [1024] = {0};
3
Wenn Sie jemals Speicher auf dem Heap zuweisen müssen, können Sie auch calloc () verwenden. Zum Beispiel char * zeroarray = calloc (1024, sizoef (* zeroarray)); .
Andrei Ciobanu
2
NB Calloc ist in Ordnung für charusw., aber wenn Sie ein Array von Zeigern möchten, sollten Sie diese explizit auf NULL setzen. Es gibt (absurderweise!) Keine Garantie dafür, dass NULL als Null-Bytes dargestellt wird. Dies, obwohl das Literal 0implizit den Nullzeiger darstellt.
Adrian Ratnapala
Mögliches Duplikat von Wie man ein Array in C
AechoLiu

Antworten:

284

Globale und statische Variablen werden automatisch auf Null initialisiert. Wenn Sie einfach haben

char ZEROARRAY[1024];

Im globalen Bereich sind es zur Laufzeit alle Nullen. Tatsächlich gibt es jedoch eine Kurzsyntax, wenn Sie ein lokales Array hatten. Wenn ein Array teilweise initialisiert ist, erhalten Elemente, die nicht initialisiert wurden, den Wert 0 des entsprechenden Typs. Sie könnten schreiben:

char ZEROARRAY[1024] = {0};

Der Compiler würde die ungeschriebenen Einträge mit Nullen füllen. Alternativ können Sie memsetdas Array beim Programmstart initialisieren:

memset(ZEROARRAY, 0, 1024);

Das wäre nützlich, wenn Sie es geändert hätten und es auf alle Nullen zurücksetzen wollten.

John Kugelman
quelle
2
{0}; funktioniert einwandfrei, C99 [$ 6.7.8 / 21] Wenn eine in Klammern eingeschlossene Liste weniger Initialisierer enthält als Elemente oder Elemente eines Aggregats oder weniger Zeichen in einem Zeichenfolgenliteral, die zum Initialisieren eines Arrays bekannter Größe verwendet werden, als vorhanden Elemente im Array, der Rest des Aggregats soll implizit genauso initialisiert werden wie Objekte, die statische Speicherdauer haben
Sasha Zezulinsky
Bitte beachten Sie: Die initialisierte 0 ist keine character. es ist ein integer.
Yonggoo Noh
1
{}Diskussion: stackoverflow.com/questions/17589533/… memset ist offensichtlich nicht korrekt: Ich denke, es funktioniert nur für 0: stackoverflow.com/questions/11138188/…
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功
1
Wenn es sich um ein Array von Strukturen handelt und -Werror=missing-bracesin gcc verwendet wird, muss es mit initialisiert werden {{0}}. Wenn das erste Strukturelement eine andere Struktur ist, dann {{{0}}}und so weiter. Siehe stackoverflow.com/questions/5434865/…
Tor Klingberg
1
Heute bin ich auf das Seltsame gestoßen, das int arr[256]={1,2,7,{0}};mich hierher gebracht hat. Ich wusste nicht einmal, dass dieses partielle Nullstellen eine Sache ist, bis ich es sah.
Neil Gatenby
32

Wenn Sie das Array mit anderen Werten als 0 initialisieren möchten, haben gccSie folgende Möglichkeiten:

int array[1024] = { [ 0 ... 1023 ] = -1 };

Dies ist eine GNU-Erweiterung von C99 Designated Initializers . In älteren GCC müssen Sie möglicherweise -std=gnu99Ihren Code kompilieren.

Deqing
quelle
14
Ausgewiesene Initialisierer sind in C99 Standard. Die Verwendung von ...zur Bezeichnung eines Bereichs ist eine gcc-spezifische Erweiterung.
Keith Thompson
1
Dies ist kein von C99 ausgewiesener Initialisierer, sondern ein GCC-spezifischer Bereichsinitialisierer . Warum sollten Sie das GCC-Handbuch anstelle des C99-Standards konsultieren?
Craig Barnes