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 Typsize_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!)