Wie initialisieren Sie ein array in C (nicht C++)?
Wie kann ich die initialisieren Sie ein array in C?
Sollte ich es definieren durch einen Zeiger: int *data[]
oder kann ich einfach code: int data[] = {};
?
Ich habe zum Beispiel definiert es wie:
int main(void) {
int data[] = {44, 22, 1, 2, 3, 1000, 3};
Nun, wie kann ich die initialisieren Sie das array data
?
- Was genau meinst du mit "neu initialisieren"?
- Meinst du frei den alten array und reservieren?
- Ich meinte genau das, initialisieren, einmal habe ich Sie erstellt ein array , dann möchte ich erneut initialisieren es mit seiner Größe und Mitglieder
Du musst angemeldet sein, um einen Kommentar abzugeben.
Initialisierung nur einmal vorkommt, wenn Sie das array erstellen:
Einmal das array definiert wurde, können Sie zuweisen, um einzelne Elemente:
aber Sie können nicht zuweisen, das array selbst; anders ausgedrückt, Sie können nicht so etwas schreiben
Sie können jedoch, verwenden Sie
memcpy
zu kopieren Inhalt von einem array zu einem anderen:Ebenso ein array erstellt auf diese Weise kann nicht geändert werden; seine Größe ist fest auf der Deklaration. In C89 und früher, die array-Größe muss zur Kompilierzeit bekannt ist - entweder durch Angabe der Größe mit einer compile-Zeit-Konstante (fester Ausdruck oder einem makro, das erweitert, um einen integralen Ausdruck) oder durch eine Initialisierung wie oben, aus denen die array-Größe wird berechnet.
C99 eingeführt variabler Länge arrays, das kann erklärt werden mit einer run-time-Wert, wie:
Beachten Sie, dass, wie bei normalen arrays, VLAs kann nicht geändert werden, nachdem Sie definiert wurden.
Alternativ können Sie dynamisch alloziert ein array mit
malloc
, obwohl Sie nicht initialisieren es in der Art und Weise vor:Können Sie noch zuordnen zu den einzelnen Elementen:
oder verwenden Sie
memcpy
wie oben gezeigt. Beachten Sie, dass müssen Sie daran denkenfree
array, wenn du fertig bist:Arrays erstellt, in dieser Art und Weise kann in der Größe verändert werden, mit
realloc
:Warum nicht einfach zuweisen, das Ergebnis
realloc
zurückfoo
? Wenn dierealloc
operation fehl, wird NULL zurückgegeben. Wenn das passiert, und wir weisen das Ergebnis wieder zufoo
verlieren wir die Spur der Erinnerung wir haben bereits zugewiesen ist, führt zu einem Speicherverlust.C99 eingeführt, ein array-literal-syntax; Sie können etwas schreiben wie
und dann ein index in
foo
wie ein array:ich bin mir zwar ziemlich sicher, dass Sie nicht änderung des Inhalts der
foo[i]
, ähnlich wie die, die Sie versuchen, zu ändern, den Inhalt einer string-literal nicht definiert ist (obwohl ich noch nicht gefunden, Kapitel und vers auf, dass).Können Sie nicht re-initialisieren Sie alle Arten als solche definitiv nicht arrays.
Die Initialisierung ist ein einmaliges Ereignis, wenn man einen Wert einer variable in der gleichen Anweisung, wenn es erstellt wird.
Könnten Sie ausdrücklich Schleife durch das array und füllen es wieder, wenn Sie brauchen, um zuweisen neue Werte zu jedem von Ihnen
ODER
Verwenden memset() oder memcpy() für die Einstellung aller Elemente auf bestimmten Wert oder kopieren bestimmte Elemente resp.
realloc()
aber das ist nicht neu-Initialisierung.Initialisierung (falls vorhanden) müssen getan werden, während der Zeit der Erstellung einer Variablen. Weil, während der compile-Zeit, der compiler ordnet diesen Wert der Variablen. Alle anderen Aufgaben, nachdem diese Zeile ausgeführt wird, während der Laufzeit nur.
In Ihrem Fall, können Sie initialisieren ein array während der Erstellung. Das nächste mal, wenn Sie einen Wert zuweisen, bedeutet nicht einen 'Initialisierung'; es ist eher ein run-time-Aufgabe, die nur.
Wenn Sie erstellen möchten, und speichern Sie Elemente dynamisch, dann kann man Zeiger verwenden, um so zu tun.
realloc()
reservieren mit einer neuen Größe.free()
löschen, werden alle zugewiesenen Speicher. In Ihrem Fall können Sierealloc()
Meine Teillösung für die Zuweisung der neuen Werte (Werke in gcc mit c99-syntax):
Ist es nicht sicher (kein bounds checking), überschreibt es können nur aufeinander folgende Mitglieder ab von Anfang an, aber ich finde es nützlich, manchmal.
Komplettes Beispiel:
Ausgabe: