Wo liegt der String? char*



  • Hallo Forum,

    ich habe ein Programm das allerhand Parameter Objekte hat. (Strukturen).
    Das möchte ich nun mit eigenen Parametern füllen.

    DoCustomize() {
    Blob->Blab = "Yes"
    }
    

    Vorher stand in Blob->Blab der String "No". Jetzt "Yes". Aber wo ist das Yes abgespeichert? Zeigt Blob->Blab jetzt irgendwo in den Heap? (Da wo Funktion DoCustomize steht?) Oder ist das Stackspace der nach Verlassen der Funktion wieder beschrieben werden könnte? (Dann wäre der Inhalt "Yes" nicht sicher.)

    Muß ich wegen dieser einen kleinen Zeile ein malloc+strcpy machen? Gibt es da keinen besseren Weg?

    Vielen Dank

    M



  • Blob zeigt auf die Adresse wo die Struktur gespeichert ist wenn du das also auf Yes umschreibst wird das direkt in der Struktur umgeschrieben da ist kein malloc nötig. Aber dazu muss die Struktur natürlich schon irgendwo erzeugt worden sein.



  • Die ganzen String-Literale werden in einem eigenen (schreibgeschützten) Speicherbereich gelagert, der unabhängig von Heap und Stack ist. Das heißt, du brauchst dich nicht um die Speicherverwaltung und Gültigkeit des Strings zu kümmern.

    PS: das "schreibgeschützt" ist wichtig, selbst wenn der Compiler dir erlaubt, mit einem normalen char* auf die Literale zu verweisen. Wenn du versuchst, diesen String zu modifizieren (z.B. per Blob->Blab[0]='J'; ), landest du im Reich des undefinierten Verhaltens.



  • Vielen Dank für die Aufklärung. Diese Einstellung ist dann wohl compilerunabhängig.

    Wäre es ein Zeiger auf einen Integer hätte ich aber das Problem? Die Addresse des Ints würde auf den Stack zeigen und würde schon bald überschrieben werden...



  • Im Prinzip schon (genauso wenn du die Adresse eines lokalen char's oder char-Arrays weiterreichen würdest), aber int's werden idR nicht über ihre Adresse weitergegeben.


Anmelden zum Antworten