Char* x = "Test" ist ein Array?
-
Wieso wird dann automatisch ein nullterminiertes Zeichen-Array erstellt? Für mich bedeutet der Befehl char* x, dass ein Zeiger auf eine char-Variable erstellt wird. Und bei diesem Befehl wird ja eine Wortkette erstellt(obwohl ein char nur ein Zeichen speichern kann).
genau, ein char* ist ein Zeiger auf ein einzelnes zeichen. In diesem Fall ist es der zeiger auf das erste zeichen der zeichenkette, also 'T'. Alle funktionen die nun mit diesem zeiger arbeiten, geben nun das 'T' aus und gehen dann eine Speicherstelle weiter, und finden das 'e', welches sie wiederum ausgeben. Das passiert nun solange, bis das Zeichen '\0' gefunden wird, das stringende zeichen. Deswegen ist es wichtig, dass diese Terminierung nicht entfernt wird, denn sonst gibt die Funktion die inhalte des Speichers aus, bis es zufälligerweise ein '\0' findet, oder das Betriebssystem das Programm stoppt.
Wie funktioniert das?
"Test" ist wie gesagt ein nullterminierter string, genauer gesagt ein char array, richtig wär also nicht
char* x[] = "Test";sondern
char x[] = "Test";jedes array ist aber auch implizit in einen zeiger umwandelbar(ein array ist eigentlich nichts anderes als ein zeiger der dann ein paar stellen weitergeschoben wird).
-
otze schrieb:
ein array ist eigentlich nichts anderes als ein zeiger der dann ein paar stellen weitergeschoben wird
o_O ich schieb es mal auf Tageszeit ^^
-
hmm ohman..
char* x = "Test";das das geht wusste ich gar nich..
dachte immer man muss
char x[]bzw.
char x[n]schreiben, damit speicehr für "Test" reserviert wird...
-
Boris, dir scheinen wirklich noch einige Grundlagen zu fehlen...
-
BorisDieKlinge schrieb:
hmm ohman..
char* x = "Test";das das geht wusste ich gar nich..
Da siehst du mal, man kann immer noch dazu lernen
Damit hast du in deinem Programm nur einen Zeiger auf einen C-String - und dieser zeigt auf das String-Literal "Test", das irgendwo im Speicher zwischengelagert ist (idR schreibgeschützt und mehrfach verwendet). Bei der Array-Variante legst du unmittelbar vor Ort genug Speicher an, wo dasnn eine eigenständige Kopie dieses Literals untergebracht wird.
-
BorisDieKlinge schrieb:
das das geht wusste ich gar nich..
Mach dir nichts draus. In der letzten Firmen galt ich als einer der C++ Experten. Und überspitzt kann ich sagen: Heute weiß ich das ich nichts weiß. Ich lese ständig Fachbücher und schaue regelmäßig zu bestimmten Themen im Internet, und ich stelle immer wieder fest das es dort immer noch neues gibt (mal nur Kleinigkeiten die man erst beim hartnäckigen lesen findet, mal zwar kleine, aber echte Wissenslücken in Einzelthemen).
Manchmal würde ich mir wünschen das ich Scheuklappen wie ein paar andere hätte, dann hätte ich es häufig im Leben leichter gehabt. Anderseits muss ich sagen bin ich so wenigstens immer einigermaßen aktuell im Wissen und werde nicht von der Entwicklung überrannt wenn ich mal wechseln sollte. Harken dabei ist: Im Beruf muss ich mit Compilern klarkommen die teilweise extrem weit von jeglichen C++ Standard sind (Bei einem kann man sogar sagen: STL was ist das?), privat setze ich aber eben auf den Standard und die STL. Und ein weiteres Problem das ich z.B. bei einer Jobsuche habe ist, das nahezu alle eingesetzten Bibliotheken Speziallösungen waren, oder Totgeburten (Beispielsweise VCL zu zeiten vom Borland Builder 5 oder die Bibliotheken von Power++).
Kurzgesagt: Du wirst wohl niemals einen Stand erreichen an dem du sagen kannst das du C++ völlig beherrschst. Irgendeine neue Erkenntnis wird es immer geben.
cu André
-
otze schrieb:
genau, ein char* ist ein Zeiger auf ein einzelnes zeichen. In diesem Fall ist es der zeiger auf das erste zeichen der zeichenkette, also 'T'. Alle funktionen die nun mit diesem zeiger arbeiten, geben nun das 'T' aus und gehen dann eine Speicherstelle weiter, und finden das 'e', welches sie wiederum ausgeben. Das passiert nun solange, bis das Zeichen '\0' gefunden wird, das stringende zeichen. Deswegen ist es wichtig, dass diese Terminierung nicht entfernt wird, denn sonst gibt die Funktion die inhalte des Speichers aus, bis es zufälligerweise ein '\0' findet, oder das Betriebssystem das Programm stoppt.
Wieso geht diese Funktion automatisch eine Speicherstelle weiter?
@all:
Danke für die Hilfe@Th:
[Ironie an]Danke für deinen tollen Beitrag[Ironie aus]
-
asc schrieb:
Kurzgesagt: Du wirst wohl niemals einen Stand erreichen an dem du sagen kannst das du C++ völlig beherrschst. Irgendeine neue Erkenntnis wird es immer geben.
*Vollkommen Zustimm*
Siehe meine Signatur
-
Gamer4 schrieb:
char* x = "Test";Das wird liebevoll als die Conversion Of Death bezeichnet. "Test" ist vom Typ const char[]. Durch die automatische Array-To-Pointer-Conversion (ein Array konviertiert bis auf wenige Ausnahmen implizit in einen Zeiger auf sein erstes Element) wird daraus ein const char*. Und das ist auch gut so, denn der Zeiger zeigt in einen Speicherbereich, der sehr wahrscheinlich nur lesbar ist und bei Schreibzugriffen von komischem Verhalten bis zu Speicherschutzverletzungen führen kann (undefiniertes Verhalten).
Warum wird dann aus einen const char* ein char*? Ein const wird dort ja schließlich sonst nie entfernt und es kommt zu einem Kompilierfehler. Zur C-Kompatibilität ist es (leider..) im Standard vorgesehen, dass ein const char* implizit in einen char* konvertieren kann - was dort auch passiert. Jeder halbwegs aktuelle Compiler warnt übrigens davor. Wenn du also in diesen Zeiger schreibst, knallt es vermutlich oder die Nasenkobolde fliegen. Bei einem char x[] = "Test" passiert dir das nicht, denn hier wird tatsächlich ein Array (der Größe 5) angelegt und mit dem Inhalt des Literals "Test" initialisiert (es wird eine schreibbare Kopie angelegt).
-
Danke für die Antworten. Ich glaube, ich habe es jetzt verstanden...
