Zeigerproblem :)



  • Ich habe eine Funktion mit einem realloc

    bool ReadSystemFile(UnicodeString &FileName, unsigned char **var)
    {
    ...
     *var = (unsigned char*) realloc(*var,filesize+1);
    ...
    }
    

    Ich habe jetzt schon seit ewig nichts mehr mit C programmiert und das Programm modifiziere ich gerade an einen neuen Compiler. Bin mit Zeigern nicht mehr so fit und hoffe jemand kann mir helfen. 🙂

    Ich wollte unter einer bestimmten Bedingnung var[100] = 0x50 setzen, aber das will nicht klappen.

    bool ReadSystemFile(UnicodeString &FileName, unsigned char **var)
    {
    ...
     *var = (unsigned char*) realloc(*var,filesize+1);
    ...
    ShowMessage("A"); // Wird angezeigt
    *var[100] = 0x50;
    ShowMessage("B"); // Wird nicht mehr angezeigt und der Wert wird auch nicht übernommen
    ...
    

    Die zweite ShowMessage() wird irgendwie direkt verschluckt, ohne eine Fehlermeldung.
    Wenn ich mit dem Wert arbeite, mit dem ich in die Funktion gehe

    ReadSystemFile("filename", &myvar);
    
    bool ReadSystemFile(UnicodeString &FileName, unsigned char **var)
    {
    ...
     *var = (unsigned char*) realloc(*var,filesize+1);
    ...
    ShowMessage("A"); // Wird angezeigt
    myvar[100] = 0x50;
    ShowMessage("B"); // Wird angezeigt und der Wert wird auch übernommen
    ...
    

    klappt es wie erwartet. Was mache ich oben falsch?



  • Pickser schrieb:

    var[100] = 0x50 setzen

    *var[100] = 0x50;
    

    Ich würde noch eine Klammer setzen, denn bei dir wird erst das [100] ausgewertet und dann erst der Stern.

    Nimm also einen der folgenden (äquivalenten) Ausdrücken:

    (*var)[100] = 0x50;
    var[0][100] = 0x50;
    *(*var + 100) = 0x50;
    *(var[0] + 100)
    

    Wenn du schlau bist, nimmst du den ersten 😉



  • Wie groß ist denn filesize an der Stelle?

    Außerdem: Der Code sieht eher nach C++ aus (Stichwort: Referenzen) - und da solltest du lieber mit den Standard-Containern hantieren als mit der C-Speicherverwaltung.



  • @solutionpointer
    Danke schön! Hat super geklappt 🙂

    @CStoll
    Da hast du vermutlich recht, aber es klappt auch so.


Anmelden zum Antworten