Wie zur Initialisierung eines char-array mit char-Zeiger in C
Sagen wir, ich habe einen char-Zeiger genannt string1, verweist auf das erste Zeichen in dem Wort "hahahaha". Ich möchte ein char[] enthält den gleichen string, string1 Punkte zu.
Wie kommen Sie auf diese nicht funktioniert?
char string2[] = string1;
- Es gibt eine Annahme, die implizit in der Frage, dass arrays und Zeiger sind das gleiche in C (versucht sich zu initialisieren, wird ein neues array der
char
durch Verweis auf einechar*
Zeiger). Ist dies nicht der Fall, und es ist wichtig zu verstehen, die Unterschiede zu vermeiden und die Einführung subtile bugs in Ihrem Programm.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil das ist nicht, wie der C-Sprache definiert wurde.
Erstellen Sie eine Kopie mit
strdup()
[Beachten Sie, dassstrdup()
ist nicht ANSI C]Refs:
In C können Sie etwas wie das hier tun:
Wenn
string1
ist definiert wie oben (ein array) mit einer Konstante Initialisierer, der compiler weiß, dass seine Länge beim kompilieren, undsizeof
zurück die Länge einschließlich der null-terminator (das ist die Größe der Daten).1) Zeiger string2 == Zeiger string1
ändern in den Wert ändern, wird der andere
Vom poster poida
2) Machen Sie eine Kopie
änderung im Wert einer von Ihnen wird sich nicht ändern, die anderen
In C Sie haben zu reservieren Speicher halten einen string.
Dies geschieht automatisch, wenn Sie definieren ein konstanter string, und weisen Sie dann zu einem char[].
Auf der anderen Seite, wenn Sie schreiben
string2 = string1
,was Sie tatsächlich tun, ist die Zuordnung der Speicheradressen von Zeiger auf char Objekte. Wenn
string2
wird erklärt, wiechar*
(Zeiger auf char), dann gilt die Zuordnung:Die variable
string2
enthält nun die Adresse des ersten Zeichens von der constanta-array von char "Hallo.".Es ist in Ordnung, auch, zu schreiben, string2 = string1 wenn
string2
ist einchar*
undstring1
ist einchar[]
.Jedoch, es wird angenommen, dass eine
char[]
ständige Adresse im Speicher. Ist nicht veränderbar.Also, es ist nicht erlaubt, zu schreiben, Sätze wie dieser:
Jedoch, Sie können ändern Sie die einzelnen Zeichen von string2, da ist ein array von Zeichen:
Was Sie schreiben, wie diese:
... eigentlich wird dies:
Hier sind wir implizit eine Berufung auf die so genannte Initialisierer.
Initialisierer ist dafür verantwortlich, dass die Zeichen-array, in dem obigen Szenario.
Initialisierung bedeutet das, hinter der Szene:
C ist ein sehr low-level Sprache. Ihre Aussage:
nicht sinnvoll, C.
Es ist nicht möglich, zuweisen eine ganze Reihe, zum anderen in C. kopieren Sie Buchstabe für Buchstabe, entweder manuell oder mithilfe von strcpy () - Funktion.
In der obigen Anweisung die Initialisierung nicht wissen, die Länge der
another_str
array-Variablen. Wenn Sie einen hard-code die Zeichenfolge anstattanother_str
, dann wird es funktionieren.Einige andere Sprachen, die es erlauben würde, solche Dinge zu tun... aber man kann nicht erwarten, dass ein manuelles Auto den Gang wechseln automatisch. Sie sind verantwortlich für es.
Zuzuordnen, können Sie die Adresse von string1 nach string2 mit Zeiger wie dieses: