PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C Pointer auf Strings



Ryuu
28-03-2005, 04:37
Hallo,
ich hab dass mit den Pointern noch nicht so ganz geschnallt.
Zum Beispiel:

char string[] = {"Hallo Welt"};
char *ptr = string;
Da wird ein Array vom Typ char definert, und danach ein Pointer der auf das erste Element dieses Arrays zeigt.
Soweit eigentlich noch alles klar. Aber ich sehe öfters in Code Beispielen dass Strings so definiert werden:

char *string = "Hallo Welt";
String ist ein Pointer der aber wohin zeigt? Wo wird den die Char Kette gespeichert?. Und bräuchte ich nicht erst ein Char Array um den String zu speichern ? Fragen über Fragen.

peschmae
28-03-2005, 09:03
char *string = "Hallo Welt";
String ist ein Pointer der aber wohin zeigt? Wo wird den die Char Kette gespeichert?. Und bräuchte ich nicht erst ein Char Array um den String zu speichern ? Fragen über Fragen.

Das ist eine abgekürzte Schreibweise die praktisch dasselbe macht. "Hallo Welt" kommt in ein "Char-Array" (Wobei die Frage ist dann ab wann man ein bisschen Speicher als Array bezeichnet...) und char *string pointet dann auf das erste Zeichen von dem Ding.
Das Ding kommt auf den Stack wie (fast) alles was du nicht mit malloc anlegst.

MfG Peschmä

RHBaum
29-03-2005, 09:25
char *string = "Hallo Welt";

Wobei jeder vernuenftige Compiler dir zumindest ne Warnung um die Ohren werfen sollte :)

"Hallo Welt"; ist ein constanter Term, die zeichenkette wird dir in nem extra speicher fuer angelegt . Wenn versucht den zu bearbeiten, wirst viel freude mit deinem Programm haben. Korrekt sollte es heissen :

const char *string = "Hallo Welt";

ciao ....

peschmae
29-03-2005, 11:50
Ok, ist doch nicht das gleiche. Der GCC sagt allerdings nichts - der segfaultet nur am Ende.

Wo kommt das Zeugs denn hin wenn ich
char *str = "bla";
mache? Auf den Stack offenbar nicht - sonst würde er ja nicht segfaulten wenn ich das was zu ändern versuche.
Ok, rtfm *ggg: http://www.eskimo.com/~scs/C-faq/q1.32.html

MfG Peschmä

panzi
29-03-2005, 12:35
AFAIK kommts in den .TEXT Block. Das ist ein readonly Teil des Programmspiechers.

t.knopp
29-03-2005, 20:38
Was ist denn der Unterschied zwischen

char *str = "Hallo";

und

char str[] = "Hallo";

Also ich seh da keinen Unterschied. Und was ist an der ersten Version schlechter?

peschmae
29-03-2005, 21:09
s.o. - das erste kannst du nicht ändern, das zweite schon. Da hier das Zeugs zwischen den " " zum initialisieren eines Array dient, beim char *str hingegen kommt das in einen (meist) nur-lesbaren Speicherbereich des Programms. Offenbar.

MfG Peschmä

Joghurt
30-03-2005, 14:00
Das zweite wird als
char a[] = {'H','a','l','l','o'};(IIRC ohne abschließende Null interpretiert. Beim ersten wird char* a der Wert von "Hallo" zugewiesen.

In Kurzform:

"string" legt 'string\0' in den Read-Only-Datenbereich an und hat den Wert der Speicheradresse.

d.h. printf("Hallo\n"); heißt eigentlich printf(POINTER_AUF_HALLO);

t.knopp
31-03-2005, 17:59
Nein. Bei beidem wird der String "Hallo\0" erstellt. Beidesmal mit dem \0 zeichen. Ich wußte nur nicht, das die pointer version const ist.