wie verhält sich dieser code im speicher??



  • hallo zusammen!

    ich verwende folgenden code. Nun interessiert mich: wenn ich malloc an 2 stellen mit der selben variable aufrufe, wird dann nur die variable geleert oder wird ein neuer speicherbereich angelegt??

    char *buffer;
    buffer = (char*)malloc(8);
    buffer="irgendwas";
    
    ..
    ..
    ..
    
    buffer = (char*)malloc(8);
    buffer="nochwas";
    

    danke schonmal



  • also so wie ich mir das denke wird ein neuer speicherbereich allociert. aber der alte ist trotzdem noch reserviert. aber du findest keinen punkt mehr in diesen reservierten speicher was zu schreiben. einfach rallocieren und für buffer neuen allocieren. zumal ich nicht weiß das das irgentwo sinn machen sollte.



  • Du musst den Speicher vorher wieder frei geben

    richtig (oder besser) wäre:

    char *buffer=NULL;
    buffer = (char*)malloc(8);
    sprintf(buffer, "irgendwas");
    
    ..
    ..
    ..
    if (buffer)
    {
        free (buffer);
        buffer = NULL;
    }
    buffer = (char*)malloc(8);
    sprintf(buffer, "nochwas");
    


  • l00P schrieb:

    buffer = (char*)malloc(8);
    

    Was soll der Cast da bei Euch beiden?



  • muß so sein denke ich.

    bei:

    char* buffer;
    buffer = malloc(8);

    gibts "Can´t convert from void* to char*

    hmmm??



  • Kaputter Compiler. Alternativ C++-Compiler, der C-Code kompilieren soll (was natürlich nicht klappt).



  • l00P schrieb:

    char *buffer;
    buffer = (char*)malloc(8);
    buffer="irgendwas";
    

    "irgendwas" ist länger als 8 Zeichen, wenn du dann in buffer speichern willst, wirst du einen Fehler bekommen, bzw. du wirst Zeichen an Stellen speichern, die vielleicht einer anderen Variables gehören. Und das ist böse.

    buffer="irgendwas";
    

    Denke mal nach, was dieser Ausdruck heißt. Ein "irgendwas" ist eine const char*, d.h. ein Zeiger auf das erste Zeichen i. Nach dem Zeichen s ist \'0' und deshalb können Funktionen wie printf das "irgendwas" als Zeichenkette interpretieren.

    buffer ist ebenfalls eine Zeiger auf ein Zeichen. D.h. buffer="irgendwas"; ist nur eine Zeigerzuweisung, du änderst nur die Adresse, auf die buffer zeigen soll, nicht dessen Inhalt!

    Ich sehe hier öfters das Problem: char* ist keine Struktur wie std::string oder Zeichenkette anderer Sprachen. char* ist nur ein Zeiger auf ein Zeichen, mehr nicht. char[] ist ein Array mit Zeichen, welches '\0' als letztes Element haben muss, um eine Zeichenkette zu speichern.

    Um den Inhalt der Zeiger zu ändern gibt es Funktionen von string.h wie memcpy, strcpy, usw.

    edit:---
    Noch was. Wenn du nochmal malloc benutzt ohne free benutzt zu haben, wirst du nur Speicherlecks generieren.

    Gibts "Can´t convert from void* to char*

    Das liegt daran, dass du den Code als C++ kompilierst. In C++ muss du explizit casten, in C nicht. Auch ein typischer Fehler bei Anfängern bzw. IDE-Nutzer, den C Code in .cpp Dateien schreiben und imme staunen, dass manchen Sachen nicht gehen. C ist keine Untermenge von C++, es gibt manche Sachen, die in C++ nicht passen.


Anmelden zum Antworten