Wie kann ich ein Array von Strings in C dynamisch zuweisen?

7

Wenn ich die Anzahl der Elemente in einer Variablen namens "totalstrings" und eine Variable namens "string size" habe, die die String-Größe jedes Elements darstellt, wie ordne ich ein Array namens "array?"

Dies ist ein Array von Strings in C, nicht C ++.

Danke!

    
gibsonfirebird12 04.10.2011, 18:19
quelle

4 Antworten

17

HINWEIS: In meinen Beispielen wird nicht nach NULL-Returns von malloc () gesucht ... Sie sollten das aber wirklich tun; Sie werden abstürzen, wenn Sie versuchen, einen Nullzeiger zu verwenden.

Zuerst müssen Sie ein Array von Zeichen-Zeigern erstellen, eines für jeden String (char *):

char **array = malloc(totalstrings * sizeof(char *));

Als nächstes müssen Sie Platz für jeden String reservieren:

%Vor%

Wenn Sie mit der Verwendung des Arrays fertig sind, müssen Sie daran denken, free() für jeden der zugewiesenen Zeiger anzugeben. Das heißt, durchlaufen Sie das Array, indem Sie free() für jedes seiner Elemente aufrufen, und schließlich auch free(array) .

    
mah 04.10.2011 18:28
quelle
9

Das allgemeine Idiom für die Zuweisung eines N by M-Arrays eines beliebigen Typs T ist

%Vor%

Nach dem Standard von 1989 müssen Sie das Ergebnis von malloc nicht mehr darstellen, und tatsächlich wird dies als schlechte Praxis angesehen (es kann eine nützliche Diagnose unterdrücken, wenn Sie vergessen haben, stdlib.h einzuschließen oder nicht) Ich habe keinen Prototyp für malloc im Umfang. Frühere Versionen von C hatten malloc return char * , also war die Besetzung notwendig, aber die Wahrscheinlichkeit, dass Sie mit einem Compiler vor 1989 arbeiten müssen, ist zu diesem Zeitpunkt ziemlich weit entfernt. C ++ macht die Umwandlung erforderlich, aber wenn Sie C ++ schreiben, sollten Sie den Operator new verwenden.

Zweitens beachte ich, dass ich den Operator sizeof auf das zuzuweisende Objekt anwende; Der Typ des Ausdrucks *a ist T * und der Typ von *a[i] ist T (in Ihrem Fall T == char ). Auf diese Weise müssen Sie sich nicht darum kümmern, den Ausdruck sizeof mit dem Typ des zugewiesenen Objekts synchron zu halten. IOW, wenn Sie sich entscheiden, wchar anstelle von char zu verwenden, müssen Sie diese Änderung nur an einer Stelle vornehmen.

    
John Bode 04.10.2011 20:26
quelle
3
%Vor%     
Chriszuma 04.10.2011 18:29
quelle
0

Nun, zuerst möchten Sie vielleicht Platz für "array" zuweisen, was ein Array von char * wäre, das "totalstrings" lang ist.

Was wären dann die Start- und Endindizes in "array"? Du weißt, der erste ist 0; Was ist der letzte?

Dann könntest du für jeden Eintrag in "array" einen Speicherbereich, der "stringsize + 1" ist (warum +1, bitte sag mir?), einen langen Bereich zuweisen, indem du die Startadresse dafür wählst Bereich - diese Zeichenfolge - in das richtige Mitglied von "Array".

Das wäre ein guter Anfang, imo.

    
Pete Wilson 04.10.2011 18:27
quelle

Tags und Links