Wie kann ich dynamisch alloziert ein array von strings in C?
Wenn ich die Anzahl der Elemente in einer var namens "totalstrings" und eine var namens "string-Länge", das ist die Zeichenfolge, die Größe jedes Elements, wie kann ich dynamisch alloziert ein array namens "array"?"
Dies ist ein array von Zeichenfolgen in C, nicht C++.
Dank!
- Es hängt davon ab, was Sie versucht haben können, und was nicht funktioniert hat.
- Und, natürlich, warum Sie denken, es hat nicht funktioniert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
HINWEIS: Meine Beispiele sind nicht NULL-Rückgabe von malloc()... sollte man das wirklich tun wenn; Sie Abstürzen, wenn Sie versuchen, einen NULL-Zeiger.
Zuerst müssen Sie erstellen Sie ein array von char-Zeigern, eine für jede Zeichenfolge (char *):
char **array = malloc(totalstrings * sizeof(char *));
Als Nächstes müssen Sie Speicherplatz für jede Zeichenfolge:
Wenn du fertig bist mit dem array, müssen Sie daran denken
free()
jeder der Hinweise, die Sie haben, reserviert. Das ist eine Schleife über das array aufrufenfree()
auf jedem seiner Elemente, und schließlichfree(array)
als gut.malloc
NULL zurückgeben in der Regel ist zu ernst, ein Fehler, weiter zu fahren, sowieso. Wir wollen nicht über-paranoid, nicht? Und was wirklich falsch ist, ist die Besetzung vonmalloc
's return-Wert, der in C ist völlig unnötig und in der Regel schlechte Praxis (aber trotzdem komme ich von einem C++-hintergrund, auch). Ansonsten gute Antwort. +1 für rembering richtigfree
.realloc()
dein array zu einer größeren Größe.Den gemeinsamen idiom für die Zuordnung eines N-von-M-array von Typ T ist
Als der 1989 standard, Sie müssen nicht gegossen das Ergebnis
malloc
, und in der Tat, so betrachtet, ist schlechte Praxis (es unterdrücken kann ein nützliches Diagnose-wenn Sie vergessen stdlib.h oder sonst nicht haben einen Prototyp fürmalloc
im Rahmen). Frühere Versionen von C hattemalloc
zurückchar *
, also die Besetzung war notwendig, aber die Wahrscheinlichkeit, dass Sie mit zu arbeiten, mit einem pre-1989-compiler sind ziemlich abgelegen an dieser Stelle. C++ hat erfordern die Besetzung, aber wenn Sie das schreiben von C++, die Sie sollten mit dennew
Betreiber.Zweitens, beachten Sie, dass ich die Anwendung der
sizeof
operator auf das Objekt zugeordnet werden können; den Typ der expression*a
istT *
, und die Art der*a[i]
istT
(wo in deinem FallT
==char
). Auf diese Weise müssen Sie nicht haben, um sorgen über das halten dersizeof
Ausdruck in Einklang mit dem Typ des Objekts zugeordnet werden. IOW, wenn Sie entscheiden, zu verwendenwchar
stattchar
Sie müssen nur machen, dass Veränderungen an einem Ort.Nun, zuerst möchten Sie vielleicht, um Speicherplatz für "array", die ein array von char *, das ist "totalstrings" lang.
Was wäre dann die Start-und final-Indizes in "array"? Sie wissen, die erste ist 0; was ist die Letzte?
Dann für jeden Eintrag im "array", Sie könnte (wenn Sie wollte) reservieren Sie einen Speicherbereich, der ist "stringsize+1" (warum +1, beten Sie, sagen Sie mir?) lange, indem die Startadresse des Bereichs -- string -- in die richtige Mitglied der "array."
Dass wäre ein guter Anfang, imo.