char* - Wann MALLOC notwendig



  • Hallo!
    Wenn ich ein char* deklariere, die Zuweisung
    einer Zeichenkette aber erst später erfolgt,
    ist dann trotzdem ein MALLOC notwendig, oder
    wird die Feldgrösse nach der Zuweisung fest-
    gelegt?
    Bis jetzt hat alles ohne MALLOC funktioniert,
    ich bin mir aber trotzdem nicht sicher, ob ich
    nicht bereits bei der Zeichenkettenzuweisung
    über die Feldgrenze hinausschreibe.
    Ich habe z. B. gemerkt, dass ein strcat mit 2
    Zeichen funktioniert, bei mehr Zeichen aber
    segfaultet. Da hat ein realloc geholfen. Das
    mein Programm mit einem "kurzen" strcat nicht
    abstürzt, seher ich eher als Zufall.



  • Du
    kannst
    den
    char
    Pointer
    auch
    erst
    später
    zuweisen.
    Warum
    schreibst
    Du
    so
    seltsam
    ?



  • Ein char* ist erstmal ein Zeiger.
    Wie groß der Bereich ist, auf den er zeigt kann man nicht feststellen.

    Wo dieser Bereich her kommt (Array oder malloc) ist auch egal.
    Hauptsache, er zeigt auf gültigen und ausreichenden Speicher.

    Zeig mal Beispielcode, damit man sehen kann was du genau meinst.



  • char *t = "Hallo Welt";   //erlaubt
    
    char *p;
    
    p = "Hallo Welt";     // Falsch denke da wird ein compilerfehler auftreten
    strcpy(p,"Hallo Welt");   // Funktioniert aber Buffer Overflow das kann zu undefinierten Verhalten führen sollte aufjedenfall vermieden werden
    [code="c"]
    
    richtig wäre
    

    char *p;
    p = (char 😉 malloc( sizeof(char) * ( strlen("Hallo Welt") + 1 ));
    strncpy(p,"Hallo Welt",strlen("Hallo Welt")+1);
    [code="c"]



  • char *t = "Hallo Welt";   //erlaubt
    
    char *p;
    
    p = "Hallo Welt";     // Falsch denke da wird ein compilerfehler auftreten
    strcpy(p,"Hallo Welt");   // Funktioniert aber Buffer Overflow das kann zu undefinierten Verhalten führen sollte aufjedenfall vermieden werden
    

    richtig wäre

    char *p;
    p = (char *) malloc( sizeof(char) * ( strlen("Hallo Welt") + 1 ));
    strncpy(p,"Hallo Welt",strlen("Hallo Welt")+1);
    


  • char *t = "Hallo Welt";   //erlaubt
    
    char *p;
    
    p = "Hallo Welt";     // Das ist völlig in Ordnung. p zeigt jetzt auf das Stringliteral "Hallo Welt"
    strcpy(p,"Hallo Welt");   // In diesem Fall gibt es auch kein Buffer Overflow, da beide Strings gleich lang sind.
    // Aber Stringliterale sind nur zum lesen da. D.h du darfst an die Stelle nichts kopieren.
    
    char *p;
    p = (char *) malloc( sizeof(char) * ( strlen("Hallo Welt") + 1 )); // Cast ist nicht nötig, sizeof(char) ist per default 1)
    // Hier fehlt die Fehlerbehandlung für malloc
    strncpy(p,"Hallo Welt",strlen("Hallo Welt")+1);  // Warum strncpy, du hast doch genung SPeicher.
    

    Das Ganz hat relativ wenig Sinn, da du so auch nicht mehr Speicher hast als beim Stringliteral.

    Wenn den Bereich beschreiben willst kannst du auch ein Array benutzen (Beachte aber die Lebenszeit (Scope))

    char p[] = "Hallo Welt";
    


  • er will es mit einem char* und nicht mit einem char Array lies dir seine Frage durch



  • @kknd
    Danke, du hast meine Frage beantwortet! Aber wenn ich mir den ein oder
    anderen bestehenden Code von manchen Linux Programmen ansehe, wird nicht
    immer durch MALLOC Speicher angefordert. Meistens erfolgt nach der
    Deklaration eine Zeichenkettenzuweisung, manchmal seh ich auch ein
    realloc. Das würde also heissen, wenn ich keinen Speicher anfordere und
    eine Zeichenkette einfach zuweise, dann ist es reiner Zufall, dass mein
    Programm nicht abstürzt?

    Ich muss char* nehmen, da ich ein paar Veränderungen an einem bestehenden
    Code mache. Und da wird mit char Zeigern gearbeitet.



  • Du denkst auf der falschen Abstraktionsebene. Frag dich einfach immer: Wohin werden die Bytes geschrieben? Wenn der Zeiger nicht garantiert auf irgendein schreibbares Objekt zeigt, machst du was falsch.

    wird nicht immer durch MALLOC Speicher angefordert.

    Die Funktion heißt übrigens malloc. Groß/Kleinschreibung ist wichtig in C. Davon ab, natürlich ist es nicht notwendig, immer malloc zu verwenden. Siehe die Grundregel oben.

    Meistens erfolgt nach der Deklaration eine Zeichenkettenzuweisung, manchmal seh ich auch ein
    realloc.

    Ja, und?

    Das würde also heissen, wenn ich keinen Speicher anfordere und
    eine Zeichenkette einfach zuweise, dann ist es reiner Zufall, dass mein
    Programm nicht abstürzt?

    Wieder: Du denkst auf der falschen Abstraktionsebene. Es gibt in C keine "Zeichenketten", die man "zuweisen" kann. Es gibt Zeichen, es gibt Zeiger, es gibt Arrays. Man kann allerlei Zeug zuweisen, aber keine Arrays, die kann man nur elementweise zuweisen. Als Sonderfall gibt es noch Zeichenkettenkonstanten. Da ich jetzt Gefahr laufe, die Postings der anderen zu wiederholen, hör ich jetzt auf. Vielleicht solltest du nochmal eine konkrete Frage stellen



  • kknd schrieb:

    er will es mit einem char* und nicht mit einem char Array lies dir seine Frage durch

    Er wäre nicht der erste, der für eine falsche Lösung den richtigen Ansatz sucht.


Anmelden zum Antworten