strcpy() auf *zeiger?!



  • Hallo!
    Wieso funktioniert ein Kopieren eines Strings mittels strcpy()-Funktion nur auf ein char-Array (string[]) und nicht auf einen Zeiger (*string1)?! Wenn ich den Zeiger mit 'char *string1="Hallo Welt";' initialisiere, dann dürfte ihm doch eigentlich Speicher zugewiesen werden, den man überschreiben kann, oder habe ich da was falsch verstanden? Beim Kopieren auf einen *zeiger kommt bei mir immer "Speicherzugriffsfehler", beim Kopieren auf ein Array klappt's. Wieso? Und wie kann ich trotzdem auf ein char*-String kopieren?



  • Original erstellt von <C Neuling>:
    *Wenn ich den Zeiger mit 'char string1="Hallo Welt";' initialisiere, dann dürfte ihm doch eigentlich Speicher zugewiesen werden, den man überschreiben kann

    Falsch. String-Literale darfst du nicht überschreiben.



  • Original erstellt von Bashar:
    Falsch. String-Literale darfst du nicht überschreiben.

    Wie habe ich das nun wieder zu verstehen?! 😞



  • Original erstellt von <C Neuling>:
    Wie habe ich das nun wieder zu verstehen?! 😞

    Wenn du im Quelltext irgendwo einen String direkt stehen darfst, darfst du den üblicherweise NICHT überschrieben, ist also quasi readonly-Speicher. Beschreibbaren Speicher musst du dir dann schon per malloc holen.

    [ Dieser Beitrag wurde am 06.05.2003 um 22:38 Uhr von TriPhoenix editiert. ]



  • Original erstellt von TriPhoenix:
    **Wenn du im Quelltext irgendwo einen String direkt stehen darfst, darfst du den üblicherweise NICHT überschrieben, ist also quasi readonly-Speicher. Beschreibbaren Speicher musst du dir dann schon per malloc holen.
    **

    Ok, habe ich verstanden! Aber wieso funktioneirt es nicht, wenn ich einen Zeiger char *zeiger; deklariere und ihm dann mit strcpy() etwas zuweisen will?
    Vielleicht, weil kein Speicher für einen String in dem Zeiger reserviert wurde?!



  • Original erstellt von <C Neuling>:
    *Ok, habe ich verstanden! Aber wieso funktioneirt es nicht, wenn ich einen Zeiger char zeiger; deklariere und ihm dann mit strcpy() etwas zuweisen will?
    Vielleicht, weil kein Speicher für einen String in dem Zeiger reserviert wurde?!

    Ganz genau. Funktionieren tut z.B. sowas:

    char *foo = (char *)malloc(14);
    strcpy(foo, "Hello, World!");
    

    Dann zeigt foo nämlich auf gültigen Speicher.



  • 1. sollte man den Rückgabewert von malloc nicht casten

    2. sollte man damit rechnen, dass malloc NULL zurückliefert



  • Original erstellt von TriPhoenix:
    **Wenn du im Quelltext irgendwo einen String direkt stehen darfst, darfst du den üblicherweise NICHT überschrieben, ist also quasi readonly-Speicher. Beschreibbaren Speicher musst du dir dann schon per malloc holen.
    **

    Letzte Nube-Frage dazu: wieso ist das Readonly-Speicher, also quasi ein const char *zeiger? Muss doch eine Erklärung dafür geben, warum das so gemacht wird?!

    Danke für das malloc(), soweit war ich bis jetzt bei C noch nicht...



  • Original erstellt von kingruedi:
    **1. sollte man den Rückgabewert von malloc nicht casten
    **

    Sorry, ich bin C++-Code gewöhnt und da muss man es 🙂 Außerdem tut auch in puren C der Cast nun wirklcih nicht weh...

    2. sollte man damit rechnen, dass malloc NULL zurückliefert

    Nicht in einem minimalbeispiel 😃



  • Original erstellt von <C Neuling>:
    **Letzte Nube-Frage dazu: wieso ist das Readonly-Speicher, also quasi ein const char *zeiger? Muss doch eine Erklärung dafür geben, warum das so gemacht wird?!
    **

    Solche Konstanten landen afair im Code-Segment also mitten da wo auch ausführbarer Code ist. Schreibbarer Speicher verursacht zusatzaufwand beim Auslagern der Prozesse, also kann man doch schonen und die dinger read-only machen, denn im Allgemienen sind solche Strings wirklcih konstanten, z.B. für ausgabe etc. und die müssen nicht schreibbar sein. Der gcc z.B. liefert eine Option mit um die DInger doch schreibbar zu machen (-fwritable-strings) aber sowas sollte man wirklich in Anwendungsprogrammen NICHT machen. Nicht zuletzt lässt dir eine Stringkonstante nur soviel Platz wie die Konstante halt lang ist, da schriebt man schnell mal aus Versehen drüber.



  • @TriPhoenix:
    in C <C99 tut das casten von malloc weh!
    und in c++ verwendest du sowieso kein malloc!!

    die strings landen aber im data segment (soweit ich weiß)



  • ich schlage vor: rom-segment, was ein schreibgeschütztes datensegment ist.


Anmelden zum Antworten