Es gibt mehrere Ansätze. Der einfachste ist, ein Array von Arrays of Char zu deklarieren, etwa so:
char strs[N][M + 1]; // M is max length of each string
...
strcpy(strs[i], "foo");
Der gesamte Speicher für die Zeichenketten wird statisch zugewiesen, aber die Größe jeder Zeichenkette im Array ist festgelegt, und Sie müssen die Größe für die längste mögliche Zeichenkette festlegen, was zu einer gewissen internen Fragmentierung führen kann. Alle Zeichenketten sind beschreibbar.
Ein anderer Ansatz besteht darin, ein Array von Zeigern auf char zu deklarieren:
char *strs[N];
...
strs[i] = malloc(strlen("bar") + 1);
if (strs[i])
strcpy(strs[i], "bar");
Auf diese Weise können Sie so viel oder so wenig Speicher zuweisen, wie jeder String im Array benötigt, und Sie können die Größe Ihrer Strings bei Bedarf ändern. Sie können auch einfach auf String-Literale verweisen, aber denken Sie daran, dass Literale möglicherweise nicht beschreibbar sind, d.h. Sie können möglicherweise nicht so etwas tun wie:
strs[j] = "foo";
strs[j][0] = 'b'; // may not be allowed on string literal
Sie können den gesamten Smash dynamisch zuweisen:
char **strs = malloc(sizeof *strs * N);
for (i = 0; i < N; i++)
strs[i] = malloc(SIZE + 1);
Auf diese Weise können Sie nicht nur die Größe jeder einzelnen Zeichenkette nach Bedarf ändern, sondern auch die Anzahl der Zeichenketten. Beachten Sie, dass in diesem Fall strs pas ein Array-Typ, auch wenn es als Array behandelt wird.
Beachten Sie, dass sich die besten Praktiken in Bezug auf malloc() zwischen C und C++ unterscheiden. In C gilt es als schlechte Praxis, das Ergebnis von malloc() zu casten. Zum einen ist es unnötig, da void-Zeiger implizit auf andere Objektzeigertypen gecastet werden. Zum anderen wird dadurch eine Diagnose unterdrückt, wenn man vergisst, stdlib.h zu inkludieren oder keinen Prototyp für malloc() im Gültigkeitsbereich hat. Denken Sie daran, dass C, wenn es keinen Prototyp für eine Funktion sieht, bevor sie referenziert wird, annimmt, dass die Funktion int zurückgibt, was nicht implizit in einen Zeigertyp umgewandelt werden kann.