Problem mit Zeiger -> Programm stürzt ab



  • "Programm stürzt ab" ist vom Standard nicht spezifiziert.
    Spezifiziert ist undefiniertes Verhalten, so auch in deinem Fall:
    Das Beschreiben von undefiniertem Speicher führt zu undefiniertem Verhalten gemäß C-Standard, das Programm zur Laufzeit kann abstürzen, muss aber nicht.

    felted schrieb:

    *char *strcat (char *str1, const char str2);

    Das Sternchen(*) steht ja für einen Zeiger.

    Die Parameter str1 und str2 müssen aber keine Zeiger sein, damit es funktioniert.

    Wieso nicht?

    char titel[1000] = "Buch";
        char *zusatz = " fuer Anfaenger"; /* Zeiger auf einen Speicherbereich, der mit dem Inhalt des Stringliterals befüllt ist und beim Ändern einzelner Zeichen zu undefiniertem Verhalten führt */
    

    d.h. also wenn du <zusatz> beschreibst oder es indirekt durch eine Funktion machen lässt, liegt undefiniertes Verhalten vor, genauso (wie oben erwähnt) wie wenn du in undefinierte Speicherbereiche reinschreibst/reinschreiben lässt.
    C-Funktionen prüfen zur Laufzeit nicht, ob der übergebene Zeiger auch auf ausreichenden oder beschreibbaren Speicher verweist.
    Das Programm kann dann abstürzen muss es aber nicht.

    Deshalb gibt es den Qualifizierer const, der anzeigt, dass dieser Speicherbereich nicht beschreibbar ist, viele Compiler warnen hier, wenn sie es merken.

    char *s = "irgendwas";
    /* ist immer gleichbedeutend mit: */
    const char *s = "irgendwas";
    

    d.h. der referenzierte Speicherbereich, auf den s verweist, darf niemals beschrieben werden, sonst UB.



  • SeppJ schrieb:

    P.S.: Anscheinend können Dateinamen doch mit Leerzeichen beginnen. Cool 🕶

    Dateinamen können (zumindest unter Unix) auch Newlines enthalten. Eigentlich alles außer '/' und '\0'. Ob man das in seinem Code nun unbedingt unterstützen sollte, ist die andere Frage. Drüber stolpern sollte man allerdings auch nicht. 😉


Anmelden zum Antworten