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ß
    Schrankwand

    das 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ß
    Schrankwand

    es 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.
    aus

    f("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ß
    Schrankwand

    so 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.

    @schrankwand

    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 folgender

    char 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.


Anmelden zum Antworten