Istnieje kilka sposobów utworzenia tablicy ciągów w C. Jeśli wszystkie ciągi będą mieć tę samą długość (lub przynajmniej taką samą maksymalną długość), wystarczy zadeklarować tablicę 2-d char i przypisać w razie potrzeby:
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");
Możesz także dodać listę inicjatorów:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1] = {"foo", "bar", "bletch", ...};
Zakłada się, że rozmiar i liczba łańcuchów w inicjalizatorze pasują do wymiarów tablicy. W tym przypadku zawartość każdego literału łańcuchowego (który sam jest tablicą znaków zakończoną zerem) jest kopiowana do pamięci przydzielonej do łańcuchów. Problemem w tym podejściu jest możliwość fragmentacji wewnętrznej; jeśli masz 99 łańcuchów, które mają 5 znaków lub mniej, ale 1 łańcuch o długości 20 znaków, 99 łańcuchów będzie zawierać co najmniej 15 nieużywanych znaków; to strata miejsca.
Zamiast używać dwuwymiarowej tablicy znaków, możesz przechowywać tablicę jednowymiarowych wskaźników do znaku:
char *strs[NUMBER_OF_STRINGS];
Zauważ, że w tym przypadku pamięć została przydzielona tylko do przechowywania wskaźników do ciągów; pamięć dla samych łańcuchów musi być przydzielona gdzie indziej (jako tablice statyczne lub za pomocą malloc()
lub calloc()
). Możesz użyć listy inicjalizacyjnej jak we wcześniejszym przykładzie:
char *strs[NUMBER_OF_STRINGS] = {"foo", "bar", "bletch", ...};
Zamiast kopiować zawartość stałych ciągów, po prostu przechowujesz do nich wskaźniki. Zauważ, że stałe łańcuchowe mogą nie być zapisywalne; możesz ponownie przypisać wskaźnik, w ten sposób:
strs[i] = "bar";
strs[i] = "foo";
Ale możesz nie być w stanie zmienić zawartości łańcucha; to znaczy,
strs[i] = "bar";
strcpy(strs[i], "foo");
może nie być dozwolone.
Możesz użyć malloc()
do dynamicznego przydzielania bufora dla każdego łańcucha i kopiowania do tego bufora:
strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");
BTW,
char (*a[2])[14];
Deklaruje jako 2-elementową tablicę wskaźników do 14-elementowych tablic char.
char (*a[2])[14]
jest to tablica dwóch wskaźników do tablicy 14 znaków.