An Stelle im Speicher auf die ein Pointer zeigt schreiben.
-
Hi,
warum funktioniert sowas nicht bzw. wie würde es funktionieren? Danke.
void ModifyString(char* str) { str[0] = '-'; }
Gruß
Schrankwand
-
schrankwand schrieb:
Hi,
warum funktioniert sowas nicht bzw. wie würde es funktionieren? Danke.
void ModifyString(char* str) { str[0] = '-'; }
Gruß
Schrankwanddas funktionier, wenn dir der speicher gehört.
double main(){ char* p; char buf[]="hallo"; ModyfyString(p);//crash, vermutlich. auf jeden fall tierisch gefährlich p=NULL; ModyfyString(p);//crash, sicher, denn NULL kann dir nicht gehören p="hallo"; ModyfyString(p);//crash, je nach compiler. stringliterale darfste nicht ändern p=buf; ModyfyString(p);//endlich klappt's }
-
Ok, danke. Aber ganz nachvollziehen kann ich das nicht, da ich schon Librarys verwendet habe bei denen es ähnliche Funktionen gab die wie folgt funktionieren.
char* str = "hallo"; ModyfyString(str); // String wurde modifiziert.
Gruß
Schrankwand
-
schrankwand schrieb:
Ok, danke. Aber ganz nachvollziehen kann ich das nicht, da ich schon Librarys verwendet habe bei denen es ähnliche Funktionen gab die wie folgt funktionieren.
char* str = "hallo"; ModyfyString(str); // String wurde modifiziert.
Gruß
Schrankwandes begab sich zu der zeit, daß borland den compiler nicht mehr turbo-c, sondern borland-c++ nannte. und der compiler hatte einen sonnigen knopf mit der aufschrift "merge duplicate strings" und die gemeinde war froh.
ausf("hallo"); f("hallo"); f("allo"); f("llo");
erlaubte er sich, unanständige dinge zu zaubern wie
char* p="hallo"; f(p); f(p); f(p+1); f(p+2);
und es standen nicht mehr 4 stringliterale in der ausführbaren datei, sondern nur noch eines. zweifellos eine der größten erfindungen der programmiergeschichte. wenn nun ein scherzkeks einen der strings modifiziert, hat er unter umständen alle kaputtgemacht. böse sache das.
destawega verbot man schichterhand, stringliterale zu ändern und erlaubte darüberhinaue den linkern die stringliterale in rom-segmente zu schreibseln. bei embedded-systems kann es echtes rom sein. bei normalen systemen können es speicherseiten sein, die als read-only, not-executable geflaggt sind. klasse sache das.
aber kein compiler muß das machen. in der tat ist es nicht unwahrscheinlich, daß im debug-modus der code geht und im release-modus nicht mehr geht.kann aber auch sein, daß das nur für c++ gilt und man in c jedes stringliteral beschreiben darf. ich kann eigentlich kein c und verwechsle immer dinge.
-
schrankwand schrieb:
Ok, danke. Aber ganz nachvollziehen kann ich das nicht, da ich schon Librarys verwendet habe bei denen es ähnliche Funktionen gab die wie folgt funktionieren.
char* str = "hallo"; ModyfyString(str); // String wurde modifiziert.
Gruß
Schrankwandso kann es nicht funktionren, denn str ist so etwas wie read-only, wenn du so deklarierst. Es ist als würdest du ein const char* str = "hallo" stehen (ich glaube das const wird implzit hinzugefügt, sicher bin ich aber nicht).
-
Ach, Volkard!
Kann ich deinen ersten Geschichtsband bitte mit (analoger) Signatur haben?
-
supertux schrieb:
ich glaube das const wird implzit hinzugefügt, sicher bin ich aber nicht
Nein, implizit wird da nichts hizugefügt. Man muss const schon selbst hinschreiben.
char* str = "hallo";
str ist ein Zeiger, der direkt auf das String Literal verweist. Und wie bereits mehrfach erwähnt, sind diese nunmal read-only. Deshalb auch der Tipp, dass du solche Sachen generell const machen solltest, dann kommst du auch nicht in Verlegenheit.
Ein einfacher Workaround für dein Problem ist folgenderchar str[] = "hallo";
Dieses Array kannst du jetzt verändern. Jedoch solltest du aufpassen, dass dir hier nicht unendlich viel Speicher zur Verfügung steht. Nämlich genau 6, 5 Inhalt + 1 abschliessendes Nullzeichen.