malloc geschichte
-
Ja, du mußt der Funktion sagen, daß sie einen Zeiger zurückgeben will:
void/*->*/ * /**/ check_malloc(size_t bytes);
(btw, wenn du schon den Header für deine Funktion einbindest, brauchst du keine zusätzliche Forward-Deklaration)
(und noch ein btw: In den Header gehört nur der Prototyp - die eigentliche Implementation solltest du in eine malloc.c auslagern. Spätestens wenn du das in einem größeren Projekt verwendest, wird dir dein Linker danken ;))
-
also erst mal ein kniefall für CStoll und GPC.
so schaut's jetzt aus und klemmt noch etwas...
//malloc.h #include <stdio.h> #include <string.h> #ifndef MALLOC_H #define MALLOC_H void * check_malloc(size_t bytes); #endif //MALLOC_H
//main.c #include "malloc1.h" int main(void) { double d = check_malloc(5 * sizeof( d )); free ( d ); void * check_malloc(size_t bytes) { void *mem; mem = malloc(bytes); if(mem == NULL) { fprintf(stderr, "ERROR : Out of memory ?!\n" " Trying to (m)allocate %i Bytes failed !\n" " File: %s Line: %d\n", (int) bytes); exit(1); } return mem; } return 0; }
wozu brauch man MALLOC_H?
Nakaa
-
Fehlermeldung:
malloc1.c: In functionmain': malloc1.c:6: error: incompatible types in initialization malloc1.c: In function
check_malloc':
malloc1.c:13: warning: assignment makes pointer from integer without a cast
-
Woop, was hast du denn jetzt gemacht? Bringen wir mal Ordnung rein:
//malloc.h #ifndef MALLOC_H #define MALLOC_H //Die includes müssen hier rein #include <stdio.h> #include <string.h> void * check_malloc(size_t bytes); #endif //MALLOC_H
//malloc.c #include "malloc.h" void * check_malloc(size_t bytes) { void *mem = malloc(bytes); if(mem == NULL) { fprintf(stderr, "ERROR : Out of memory ?!\n" " Trying to (m)allocate %d Bytes failed !\n" " File: %s Line: %d\n", bytes, __FILE__, __LINE__ ); exit(1); } return mem; }
//main.c #include "malloc.h" int main(void) { double *d = check_malloc(5 * sizeof( *d )); free ( d ); return 0; }
Okay, jetzt haben wir drei Dateien: malloc.h, malloc.c und main.c Die kompilierst und linkst du und dann läuft das.
wozu brauch man MALLOC_H?
Das ist ein so genannter Include-Guard: http://tutorial.schornboeck.net/pp_if.htm
MFG
GPC
-
GPC schrieb:
fprintf(stderr, "ERROR : Out of memory ?!\n" " Trying to (m)allocate %i Bytes failed !\n" " File: %s Line: %d\n", (int) bytes);
3 platzhalter aber nur 1 argument für 'fprintf' kann auch für seltsames verhalten sorgen
-
^^ Jo, da hab ich gepennt beim Copy & Paste. Ich nahm an, dass der Threadersteller fprintf im Griff hat...
so, jetzt passt's.
-
also leute,
double d = check_malloc(5 * sizeof( d ));
mag mein compile einfach nich.
main.c:5: error: incompatible types in initialization
und auch das warning wird ausgegeben.....
/* um das gesicht zu wahren, der fprint war auch gecopied und gepastet ...*/
-
Du hast es heute mit den Sternchen, oder
check_malloc() gibt einen Pointer zurück, also mußt du die Ausgabe auch einer Pointer-Variablen ("double * d = ...;") zuweisen.
-
...und weil d ein pointer sein sollte nimm '5*sizeof(double)' für 5 doubles, nicht '5*sizeof(d)'
-
verdammte axt!!!
also malloc gibt nen void pointer zurück, deshalb muss ich ne void * funktion haben und den rückgabewert auch nem pointer zuweisen.
demnächst besser denken vorm posten.
molte grazieeee!!!!!!!!!!!!!!!!!