Frage bezüglich char-Zeiger
-
Hallo !
Warum führt folgende Befehlsfolge zu einem Speicherzugriffs-Fehler ?
char *str="irgendwas" ;
*str='A' ;str ist ja ein Zeiger auf die Zeichenkette "irgendwas", d.h. wenn ich *str='A' schreibe, müsste doch eigentlich das 'i' durch das 'A' ersetzt werden, oder ?
lg, Markus
-
Weil du dir so eine Konstante definiert hast.
-
Sieh dir dazu auch folgenden Thread an (ist allerdings englisch):
http://www.c-plusplus.net/forum/viewtopic-var-t-is-211793.html
-
Nexus schrieb:
Sieh dir dazu auch folgenden Thread an (ist allerdings englisch):
http://www.c-plusplus.net/forum/viewtopic-var-t-is-211793.htmlstd::cout << reinterpret_cast<int>(a) << " " << reinterpret_cast<int>(b) << std::endl;
wenn ich sowas sehe, weiss ich immer nicht ob ich lachen, weinen, oder krämpfe kriegen soll.
-
oje schrieb:
std::cout << reinterpret_cast<int>(a) << " " << reinterpret_cast<int>(b) << std::endl;
wenn ich sowas sehe, weiss ich immer nicht ob ich lachen, weinen, oder krämpfe kriegen soll.
Lachen ist in dieser Auswahl am gesündesten
Wie gibst du denn Zeigeradressen aus?
-
hm. im prinzip brauche ich das nicht wirklich. ausser mal nur so zum gucken:
printf("%p", a );
-
Badestrand schrieb:
Wie gibst du denn Zeigeradressen aus?
static_cast nach void*
-
oje schrieb:
std::cout << reinterpret_cast<int>(a) << " " << reinterpret_cast<int>(b) << std::endl;
wenn ich sowas sehe, weiss ich immer nicht ob ich lachen, weinen, oder krämpfe kriegen soll.
naja, es soll leute geben, die nicht wissen, dass 'printf' auch in c++ geht.
-
vsnprintf-freak schrieb:
naja, es soll leute geben, die nicht wissen, dass 'printf' auch in c++ geht.
und ohne boost und templates ist da auch nix zu machen.
unter dem läuft da nix.
-
don't feed the troll
-
markusk2510 schrieb:
Hallo !
Warum führt folgende Befehlsfolge zu einem Speicherzugriffs-Fehler ?
char *str="irgendwas" ;
*str='A' ;str ist ja ein Zeiger auf die Zeichenkette "irgendwas", d.h. wenn ich *str='A' schreibe, müsste doch eigentlich das 'i' durch das 'A' ersetzt werden, oder ?
lg, Markus
Im Allgemeinfall ja, jedoch str zeigt auf ein Stringliteral [1] und diese sind schreibgeschützt.
Würdest du so machen:
char str[]="irgendwas" ; *str='A' ;
dann wäre das 'i' tatsächlich durch 'A' ersetzt worden. Das liegt daran, dass der str kein Zeiger ist sondern ein Feld, welches mit dem Inhalt des Strings "irgendwas" initialisiert ist, d.h. str ist ein Feld der Größe strlen("irgendwas")+1 (+1 wegen des abschließenden \0-Zeichens).
[1] Stringliterale sind String, die in Anführungszeichen im Quellcode auftauchen.
-
supertux schrieb:
...jedoch str zeigt auf ein Stringliteral [1] und diese sind schreibgeschützt.
sie können schreibgeschützt sein, oder z.b. mehrfach verwendung finden, was den schreibzugriff zu einem unvorhersehbaren ergebnis macht. daher niemals "hello"[n] = ...; oder ähnliches machen.
-
ein dicker hund ist das, das es die
char* str = "ich bin schreibgeschützt";
gibt.
fragt man sich wozu überhaupt
-
ein dicker hund schrieb:
fragt man sich wozu überhaupt
damit stringkonstanten z.b. im ROM abgelegt werden können. solch ein speichertyp ist naturgemäß immer schreibgeschützt.