reservieren von Speicherplatz mit malloc



  • Hey,

    habe ein Problem bei der Reservierung von Speicherplatz mit dem Befehl "malloc".
    Als Fehler wird mir immer "invalid operands to binary *" gemeldet.

    Hier mal der Quellcode:
    Der Fehler taucht in der gekennzeichneten Zeile auf.

    [cpp]int readFile(char* filename, unsigned char** buffer, long* bufferSize)
    {
        int erg = 1;
        FILE * image;
        size_t result;
    
        //Datei öffnen
        image = fopen ( filename , "rb" );
    
        // Dateigröße ermitteln
        if (image==NULL)
        {
            //perror ("Error opening file");
            erg = 0;
        }
        else
        {
            fseek (image, 0, SEEK_END);
            bufferSize=ftell (image);
    
            // Speicherbereich der ermittelten Größe reservieren
            [b]*buffer = (unsigned char*) malloc (sizeof(unsigned char)* bufferSize);[/b]
    
            if (image==NULL)
            {
                //perror ("Error opening file");
                erg = 0;
            }
            else
            {
                // Datei wird in den Speicher kopiert
                result = fread (*buffer,1,bufferSize,image);
    
                // Datei schließen
                fclose (image);
    
                // Speicher freigeben
                free (*buffer);
                free (buffer);
            }
    
        return erg;
    }
    
    int main()
    {
        //Pointer auf ein char welches den Dateinamen enthällt
        char * filename = "rauschen.bmp";
        //Pointer um später auf den reservierten Speicherbereich zu zeigen
        unsigned char * bufferP;
        //Pointer auf den Pointer welcher später auf den reservierten Speicherbereich zu zeigt
        unsigned char * buffer;
    
        buffer = &bufferP;
    
        long * bufferSize;
    
        int erg = readFile(filename, buffer, bufferSize)
        printf("erg = %i",erg);
    
        return 0;
    }[/cpp]
    

    Falls ihr euch wundert - der buffer soll, meiner Aufgabenstellung nach, ein Pointer auf einen Pointer sein der auf der Speicherplatz zeigt.

    Danke im Voraus



  • Da waren einige Fehler drin. So kompiliert es und ich hoffe auch, dass es jetzt das tut was du gerne hättest 😃

    int readFile(const char *filename, unsigned char **buffer, long *bufferSize)
    {
        int erg = 1;
        FILE *image;
        size_t result;
    
        //Datei öffnen
        image = fopen (filename, "rb");
    
        // Dateigröße ermitteln
        if (image==NULL)
        {
            //perror ("Error opening file");
            erg = 0;
        }
        else
        {
            fseek(image, 0, SEEK_END);
            *bufferSize = ftell(image);
    
            // Speicherbereich der ermittelten Größe reservieren
            *buffer = (unsigned char *) malloc(sizeof(unsigned char) * *bufferSize);
    
            if (image==NULL)
            {
                //perror ("Error opening file");
                erg = 0;
            }
            else
            {
                // Datei wird in den Speicher kopiert
                result = fread (*buffer, 1, *bufferSize, image);
    
                // Datei schließen
                fclose (image);
    
                // Speicher freigeben
                free (*buffer);
                //free (buffer); << ist unnötig, da nur *buffer mit malloc() angefordert wurde
            }
        }
    
        return erg;
    }
    
    int main()
    {
        //Pointer auf ein char welches den Dateinamen enthällt
        const char *filename = "rauschen.bmp";
    
        //Pointer um später auf den reservierten Speicherbereich zu zeigen
        unsigned char *bufferP;
        //Pointer auf den Pointer welcher später auf den reservierten Speicherbereich zu zeigt
        unsigned char **buffer;
    
        buffer = &bufferP;
    
        long bufferSize;
    
        int erg = readFile(filename, buffer, &bufferSize);
    
        printf("erg = %i",erg);
    
        return 0;
    }
    


  • Gargamel11111 schrieb:

    // Speicherbereich der ermittelten Größe reservieren
            *buffer = (unsigned char *) malloc(sizeof(unsigned char) * *bufferSize);
    

    Der Rückgabewert von malloc wird nicht gecastet.



  • Janjan schrieb:

    Der Rückgabewert von malloc wird nicht gecastet.

    ach, darüber reg ich mich schon gar nicht mehr auf, habs irgendwann aufgegeben. 🙄

    lg lolo



  • Janjan schrieb:

    Der Rückgabewert von malloc wird nicht gecastet.

    Und am Sonntag gehen wir in die Kirche.
    🙂



  • Der Code hat aber noch einige Fehler bzw. Probleme

    int readFile(const char *filename, unsigned char **buffer, long *bufferSize)
    

    bufferSize sollte lieber vom Typ size_t sein

    *buffer = (unsigned char *) malloc(sizeof(unsigned char) * *bufferSize);
    

    wie bereits gesagt: nicht casten! Siehe http://www.c-plusplus.net/forum/viewtopic.php?t=206606

    und sizeof(unsigned char) ist immer 1.

    fseek(image, 0, SEEK_END);
            *bufferSize = ftell(image);
    

    Das wird zwar oft gemacht. Aber ist im Prinzip falsch und nicht garantiert, dass es funktioniert.

    else
            {
                // ...
                fclose (image);
    

    Wenn malloc fehlschlägt, dann wird das filehandle nicht freigegeben!

    free (*buffer);
    

    sicher, dass du den buffer hier freigeben willst? Macht wenig Sinn (da du dann ja nicht mehr auf den Inhalt zugreifen darfst!)


Anmelden zum Antworten