Speicherzugriffsfehler



  • 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