Zeiger auf Literale



  • Warum bekomme ich bei folgenden Code einen Speicherfehler:

    char *p = "Hello World!";
      strcpy(p, "Fehler");
    

    Folgender Code funktioniert:

    char p[] = "Hello World!";
      strcpy(p, "Fehler");
    

    Sind in C nicht Arrays das selbe wie ein Zeiger auf das erste Element? Woher kommt dann der Fehler? Ich würde darauf tippen, dass *p auf ein Segment zeigt, worauf ich nicht schreiben kann, während p[] auf dem Stack liegt.



  • mit den segmenten liegst du richtig.
    schreibzugriff auf stringkonstanten hat undefiniertes verhalten.
    bei char irgendwas[] wird der buffer nur mit der stringkonstante initialisiert.



  • 123 schrieb:

    Sind in C nicht Arrays das selbe wie ein Zeiger auf das erste Element?

    Nö.

    123 schrieb:

    Woher kommt dann der Fehler? Ich würde darauf tippen, dass *p auf ein Segment zeigt, worauf ich nicht schreiben kann, während p[] auf dem Stack liegt.

    Im Grunde schon richtig. *p referenziert das Literal selbst, und Schreibzugriffe auf String Literale sind aber nicht erlaubt ( ➡ undefiniert). p[] ist eine Kopie, welche automatischen Speicher belegt. Und diesen kannst du natürlich beschreiben.



  • 123 schrieb:

    Sind in C nicht Arrays das selbe wie ein Zeiger auf das erste Element?

    Nein, sind sie definitiv nicht (das merkst du spätestens, wenn du char[][] in char** umwandeln willst). Arrays fassen eine bestimmte Anzahl an Elementen eines Typs, Zeiger enthalten eine Adresse, an der (zunächst) ein einzelnes Element des Grundtyps steht. Du kannst lediglich Arrays implizit in Zeiger umwandeln lassen, wenn du es benötigst.



  • drei leute schreiben das selbe im abstand von mehreren stunden...


Anmelden zum Antworten