Es gibt verschiedene Möglichkeiten, ein Array von Zeichenfolgen in C zu erstellen. Wenn alle Zeichenfolgen dieselbe Länge (oder zumindest dieselbe maximale Länge) haben sollen, deklarieren Sie einfach ein 2D-Array von Zeichen und weisen es nach Bedarf zu:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1];
...
strcpy(strs[0], aString); // where aString is either an array or pointer to char
strcpy(strs[1], "foo");
Sie können auch eine Liste von Initialisierern hinzufügen:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1] = {"foo", "bar", "bletch", ...};
Dies setzt voraus, dass die Größe und Anzahl der Zeichenfolgen im Initialisierer mit Ihren Array-Abmessungen übereinstimmen. In diesem Fall wird der Inhalt jedes Zeichenfolgenliteral (das selbst ein nullterminiertes Array von Zeichen ist) in den Speicher kopiert, der strs zugewiesen ist. Das Problem bei diesem Ansatz ist die Möglichkeit einer internen Fragmentierung; Wenn Sie 99 Zeichenfolgen mit maximal 5 Zeichen, aber 1 Zeichenfolge mit 20 Zeichen haben, enthalten 99 Zeichenfolgen mindestens 15 nicht verwendete Zeichen. Das ist Platzverschwendung.
Anstatt ein 2D-Array von Zeichen zu verwenden, können Sie ein 2D-Array von Zeigern auf Zeichen speichern:
char *strs[NUMBER_OF_STRINGS];
Beachten Sie, dass Sie in diesem Fall nur Speicher zugewiesen haben, um die Zeiger auf die Zeichenfolgen zu halten. Der Speicher für die Zeichenfolgen selbst muss an anderer Stelle zugewiesen werden (entweder als statische Arrays oder mithilfe von malloc()
oder calloc()
). Sie können die Initialisierungsliste wie im vorherigen Beispiel verwenden:
char *strs[NUMBER_OF_STRINGS] = {"foo", "bar", "bletch", ...};
Anstatt den Inhalt der Zeichenfolgenkonstanten zu kopieren, speichern Sie einfach die Zeiger darauf. Beachten Sie, dass Zeichenfolgenkonstanten möglicherweise nicht beschreibbar sind. Sie können den Zeiger wie folgt neu zuweisen:
strs[i] = "bar";
strs[i] = "foo";
Möglicherweise können Sie den Inhalt der Zeichenfolge jedoch nicht ändern. dh
strs[i] = "bar";
strcpy(strs[i], "foo");
darf nicht erlaubt sein.
Sie können malloc()
den Puffer für jede Zeichenfolge dynamisch zuweisen und in diesen Puffer kopieren:
strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");
Übrigens,
char (*a[2])[14];
Deklariert a als 2-Element-Array von Zeigern auf 14-Element-Arrays von char.
char (*a[2])[14]
ist ein Array von zwei Zeigern auf ein Array von 14 Zeichen.