Speicherzugriffsfehler



  • Hi,
    ich hätte eine kurze Frage:

    Warum kriege ich hier einen Speicherzugriffsfehler, das verstehe ich nicht ganz:

    char *a="Hallo";
    a[2]='c';
    

    ?



  • Habs selbst rausbekommen:

    "Konstante Werte werden bei der Übersetzung durch den Compiler hartcodiert, d.h. die Werte sind nicht irgendwo im Speicher abgelegt, von wo sie bei Bedarf ausgelesen werden können, sondern die Werte stehen direkt in den betreffenden Maschinenbefehlen" (C/C++ New Reference, S.99)

    Trotzdem danke! 😃



  • char* t= "Hallo";
    

    ist nichts anders als

    const char* t= "Hallo";
    

    du kannst den Inhalt der Daten nicht ändern, auf die t zeigt. Wenn du aber es trotzdem willst, musst du so machen:

    char t[] = "Hallo";
    ...
    

    oder so

    char* t;
    t = malloc(6);
    strcpy(t, "Hallo");
    t[2]='c';
    free(t);
    


  • Was ist der Unterschied zwischen

    char* t= "Hallo";
    

    und

    char t[] = "Hallo";
    


  • cc -Wall schrieb:

    Was ist der Unterschied zwischen

    char* t= "Hallo";
    

    Hier wird ein Zeiger definiert, der auf einen konstanten Speicherbereich zeigt.

    und

    char t[] = "Hallo";
    

    Hier wird ein Array definiert, für das Speicher reserviert wird in der Größe von 6 Byte (Hallo + Stringendezeichen) und zusätzlich der reservierte Speicher mit dem Initialisierungsstring gefüllt wird.



  • cc -Wall schrieb:

    Was ist der Unterschied zwischen

    char* t= "Hallo";
    

    und

    char t[] = "Hallo";
    

    wie gesagt, char* t = "Hallo"; ist konstanter Speicher. Ein zeiger ist eine Variable, die eine Adresse speichert. Der Ausdruck "hallo" wird konstant im Speicher generiert und an t zugewiesen, deshalb zeigt t auf "hallo", aber der Speicher ist wie gesagt konstant und darf nicht geändert werden.

    außerdem ist char* ein Zeiger, also eine Variable, die auf eine andere zeigt bzw. eine Adresse speichert. char[] ein Array (Feld), also eine Variable von typ char, das mehrere Elemente von typ char enthält. Das sind 2 komplett unterschiedliche Datentypen. (Zeiger!=Array)



  • Danke für eure Antworten, ich kapiers jetzt 🙂

    Allerdings hätte ich noch eine Frage:

    char* t = "Hallo";
    

    Die Zeichenkette ist also in einem read-only Speicherbereich angelegt.
    In welchem Segment ist das aber nun genau?
    Datensegement?



  • ich schätze mal heap?



  • egal schrieb:

    Die Zeichenkette ist also in einem read-only Speicherbereich angelegt.

    glaub auch nicht, dass es wirklich im "read-only" bereich landet. der sollte eigentlich nur für das betriebssys. reserviert sein! es wird einfach const deklariert... -> was das mit dem "read-only" ja nicht impliziert 🙂

    hth,
    ciao



  • hephaistos6 schrieb:

    egal schrieb:

    Die Zeichenkette ist also in einem read-only Speicherbereich angelegt.

    glaub auch nicht, dass es wirklich im "read-only" bereich landet. der sollte eigentlich nur für das betriebssys. reserviert sein! es wird einfach const deklariert... -> was das mit dem "read-only" ja nicht impliziert 🙂

    hth,
    ciao

    doch doch.. man kann nicht mehr darauf schreiben --> read-only

    mfg (c)h



  • meiner meinung nach kann mit const deklarierte konstanten immernoch aendern, d.h. stehen sie nicht in einem "read only" bereich, da man sie ja aendern kann. nur mit

    #define
    

    deklarierte konstanten sind konstant, aber keine ahnung, ob sie in einem read-omly bereich stehen!



  • asddfgh schrieb:

    meiner meinung nach kann mit const deklarierte konstanten immernoch aendern, d.h. stehen sie nicht in einem "read only" bereich, da man sie ja aendern kann. nur mit

    #define
    

    deklarierte konstanten sind konstant, aber keine ahnung, ob sie in einem read-omly bereich stehen!

    🙄 🙄 🙄
    SIE SIND READ-ONLY!
    mit defines wird ja nur der Präprozessor beeinflusst und das sind KEINE VARIABLEN! sie stehen nicht im (sagen wir mal) "variablenspeicherbereich" sondern im "Programmspeicherbereich"
    Unterschied:
    const= constante variable
    define= keine variable - wird direkt im quellcode eingesetzt.

    mfg (c)h



  • asddfgh schrieb:

    meiner meinung nach kann mit const deklarierte konstanten immernoch aendern, d.h. stehen sie nicht in einem "read only" bereich, da man sie ja aendern kann. nur mit

    #define
    

    deklarierte konstanten sind konstant, aber keine ahnung, ob sie in einem read-omly bereich stehen!

    nein, komplett falsch. Eine Konstante heißt Konstante, weil sie konstant bleibt und sich nicht mehr ändern lässt. Dabei ist das schon nur read-only, d.h. du kannst druaf zugreifen, aber nicht ändern.

    Die Konstanten, die man mit #define definiert, sind in Wirklichkeit keine Konstanten, nicht einmal eine Variable, sie sind Makros

    #define COS 87
    

    wenn der Compiler (außer innerhabl von " ") ersetzt alle COS durch 87 bevor es kompiliert wird. Wenn du sowas hast

    COS = 2;
    

    um den Wert von COS zu ändern, wirst du einen Compilerfehler erzeugen, denn in Wirklichkeit

    87 = 2;
    

    kompiliert wird. Also kann man die #defines ebenso wenig ändern, wie const Variablen, eigentlich weniger weil COS nicht im Speicher gespeichert wird.



  • @supertux: ^^ hatte ich doch auch schon erwähnt..


Anmelden zum Antworten