HOWTO · C
Initialisieren eines Arrays auf 0 in C
Dieses Tutorial stellt verschiedene Möglichkeiten vor, ein Array in C auf 0 zu initialisieren
Auf dieser Seite
Um jedes Element eines int-Arrays bereits bei der Deklaration auf null zu setzen, verwenden Sie int values[5] = {0};. C initialisiert das erste Element mit 0 und setzt auch alle übrigen, im Aggregat nicht ausdrücklich angegebenen Elemente auf null. Wenn das Array bereits existiert, weisen Sie jedem Element in einer Schleife einen Wert zu. memset kann die Bytes eines Arrays mit Nullen füllen, ist aber kein allgemeiner Ersatz für die Initialisierung typisierter Werte.
Ein Array bei der Deklaration auf null initialisieren
Verwenden Sie einen Initialisierer, wenn die Größe des Arrays bei seiner Deklaration bekannt ist. Das folgende vollständige Beispiel gibt die fünf initialisierten Werte aus.
#include <stdio.h>
int main(void) {
int values[5] = {0};
for (size_t i = 0; i < sizeof values / sizeof values[0]; ++i) {
printf("%d%s", values[i], i == 4 ? "\n" : " ");
}
return 0;
}
0 0 0 0 0
Der Initialisierer {0} weist dem ersten Element ausdrücklich den Wert null zu; bei der Aggregatinitialisierung werden auch die ausgelassenen Elemente auf null gesetzt. Bei einem Objekt mit statischer oder Thread-Speicherdauer können Sie den Initialisierer ebenfalls weglassen: C initialisiert es automatisch mit null. Ein gewöhnliches, nicht initialisiertes lokales Array hat automatische Speicherdauer; seine Elemente werden daher nicht automatisch auf null gesetzt. Fügen Sie einen Initialisierer hinzu oder weisen Sie den Elementen Werte zu, bevor Sie sie lesen.
Ein Array mit einer Schleife auf null initialisieren
Eine Schleife ist hilfreich, wenn das Array bereits deklariert wurde oder die Werte erst während der Ausführung festgelegt werden. Dieses vollständige Beispiel verwendet die Anzahl der Array-Elemente als Schleifengrenze und gibt das Ergebnis aus.
#include <stdio.h>
int main(void) {
int values[5];
size_t count = sizeof values / sizeof values[0];
for (size_t i = 0; i < count; ++i) {
values[i] = 0;
}
for (size_t i = 0; i < count; ++i) {
printf("%d%s", values[i], i + 1 == count ? "\n" : " ");
}
return 0;
}
0 0 0 0 0
Der Ausdruck sizeof funktioniert hier, weil values im selben Gültigkeitsbereich ein Array und kein Zeigerparameter ist. Übergeben Sie ein Array an eine Funktion, müssen Sie seine Länge separat mitgeben: Innerhalb der Funktion wird der Parameter zu einem Zeiger angepasst, und sizeof liefert die Größe des Zeigers.
memset() mit Bedacht verwenden
Die Standardbibliotheksfunktion memset schreibt denselben Bytewert in einen Speicherbereich. Binden Sie <string.h> ein und verwenden Sie sizeof values, um das gesamte Array im aktuellen Gültigkeitsbereich abzudecken, wie in diesem vollständigen Beispiel.
#include <stdio.h>
#include <string.h>
int main(void) {
int values[5];
memset(values, 0, sizeof values);
for (size_t i = 0; i < sizeof values / sizeof values[0]; ++i) {
printf("%d%s", values[i], i == 4 ? "\n" : " ");
}
return 0;
}
0 0 0 0 0
Das dritte Argument gibt die Anzahl der Bytes an; für dieses Array ist sizeof values daher richtig. memset weist nicht jedem Element einen typisierten Wert zu, sondern schreibt eine Darstellung, bei der alle Bits null sind. Verwenden Sie die Funktion nur, wenn diese Darstellung für den Elementtyp und die Plattform geeignet ist. Für eine portable semantische Nullinitialisierung eines Arrays bei der Deklaration ist {0} vorzuziehen. Gehen Sie nicht davon aus, dass Nullbytes in jeder C-Implementierung einen Nullzeiger oder den Gleitkommawert null darstellen.
Ein Array mit anderen Werten als null initialisieren
Listen Sie die gewünschten Werte im Initialisierer auf, zum Beispiel int values[] = {2, 4, 6};. C leitet die äußere Dimension aus der Anzahl der Initialisierer ab. Bei einem mehrdimensionalen Array darf in dieser Form nur die äußere Dimension entfallen: int grid[][3] = {{1, 2, 3}, {4, 5, 6}};; die innere Dimension muss angegeben werden.
GNU-Bereichsdesignatoren wie int values[5] = {[0 ... 4] = 7}; sind eine GCC-Erweiterung und keine portable Standardsyntax von C. Wenn der Code mit verschiedenen C-Compilern portabel sein soll, verwenden Sie eine gewöhnliche Initialisierungsliste oder eine Schleife. Ein zusammengesetztes Literal wie (int[]){1, 2, 3} erzeugt in diesem Funktionskontext ein unbenanntes Array mit Blocklebensdauer. Es ist keine dynamische Speicherzuweisung und ersetzt keine benannte Arraydeklaration zur allgemeinen Initialisierung.