Gå til innhold

c og malloc, kode fra 2003 vil ikke kompilere.


Anbefalte innlegg

Hei, driver å ser på litt kode fra 2003 her. Nå har jeg aldri programmert i c, men når jeg prøver å kompilere dette klager den over «char *data, *malloc();», nå har jeg begrensede kunnskaper om malloc, men jeg har prøvd å endre til bare «char *data;», og da kompilerer den. Men er det noen som kan fortelle meg hva det prøves på her? Er dette noe som har endret seg siden koden ble skrevet?Dersom du ser i koden så klager den ikke over «char *new_ptr, *realloc();».

Klikk for å se/fjerne innholdet nedenfor
/*
* Malloc: like malloc but handles out of memory using Fatal_Error.
*/
char *Malloc(size)
unsigned size;
{
char *data, *malloc();

if (!(data = malloc(size)))
	 Fatal_Error("Out of memory!");

return(data);
}

/*
* Realloc: like Malloc except for realloc, handles NULL using Malloc.
*/
char *Realloc(ptr, size)
	char *ptr;
	 int size;
{
char *new_ptr, *realloc();

if (!ptr)
	return(Malloc(size));

if (!(new_ptr = realloc(ptr, size)))
	Fatal_Error("Out of memory!");

return(new_ptr);
}

cvs

 

Klikk for å se/fjerne innholdet nedenfor
 dsimple.c: In function 'Malloc':
	 dsimple.c:72: error: conflicting types for 'malloc'
	 dsimple.c: In function 'Realloc':
	 dsimple.c:88: warning: conflicting types for built-in function 'realloc'
	 dsimple.c: In function 'Fatal_Error':
	 dsimple.c:535: warning: incompatible implicit declaration of built-in function 'exit'
	 make[1]: *** [dsimple.o] Error 1
	 make[1]: Leaving directory `/home/dewszaq/treewm-0.4.5/xprop'
	 make: *** [xprop] Error 2

Endret av Blackslash
Lenke til kommentar
Videoannonse
Annonse

Hmm, var litt rot i den koden ;), men...Skal du bruke malloc (la oss si du har opprettet en ny struct), f.eks math_t, da blir det sånn får å frigjøre minne:

 

math_t *pluss

 

pluss = malloc(sizeof(math_t));

 

altså, pluss kaller malloc, og ber den legge av nok minne til math_t.

 

Og siden du får klader på char *malloc vil jeg tro det er fordi malloc er en funksjon, altså den er i bruk og derfor blir kompilatoren bare forvirret ;)

Lenke til kommentar

Linjen

char *data, *malloc();

gir ingen mening for meg. malloc() returnerer jo en pointer(right?), men på denne linjen oppgis jo ikke hverken størrelse eller hvor pointeren skal lagres. Men så vidt meg bekjent så har denne koden kompilert for en stund siden... I svn-en står det noen steder «updated xx/xx - 87», er dette noe som har endret seg siden den gang, da?

Lenke til kommentar
Linjen

char *data, *malloc();

gir ingen mening for meg. malloc() returnerer jo en pointer(right?), men på denne linjen oppgis jo ikke hverken størrelse eller hvor pointeren skal lagres. Men så vidt meg bekjent så har denne koden kompilert for en stund siden... I svn-en står det noen steder «updated xx/xx - 87», er dette noe som har endret seg siden den gang, da?

 

Ga ikke meg mye mening heller, *malloc[] hadde vel kanskje blitt noe annet, siden [] er størrelse av et array, men er usikkert selv. *malloc() er forøvrig en pointer ja

Lenke til kommentar

For en rar syntaks det var på den koden... aldri sett før...

 

/*
* Malloc: like malloc but handles out of memory using Fatal_Error.
*/
char *Malloc(unsigned size)
{
char *data;

if (!(data = malloc(size)))
	 Fatal_Error("Out of memory!");

return data;
}

/*
* Realloc: like Malloc except for realloc, handles NULL using Malloc.
*/
char *Realloc(char* ptr, unsigned size)
{
char *new_ptr;

if (!ptr)
	return Malloc(size);

if (!(new_ptr = realloc(ptr, size)))
	Fatal_Error("Out of memory!");

return new_ptr;
}

 

Burde kompilere tenker jeg.

Lenke til kommentar

	char *data, *malloc();

Om jeg ikke tar helt feil, så deklareres det her en peker til char og en funksjon (malloc) som returnerer char*. Kompilatoren har allerede en definisjon på malloc som returnerer void*, så den klager over "conflicting types". Det tror jeg.

 

Edit: hvorfor noen ville ønske å gjøre dette, vet jeg ikke.

Endret av staalezh
Lenke til kommentar

malloc returnerer void pointer.

I koden over deklareres den med en annen type(char *), så selvfølgelig blir det conflicting type.

 

btw., visste ikke at man fikk lov til å gjøre forward declaration inne i en funksjon.

Lenke til kommentar
Er det ikke slik at en ikke trenger caste fra void* til andre i C?

I C++ må en det, men ikke i C mener jeg å huske...

Man får et implisitt kast i C.

 

Fra wikipedia:

int x = 4;
void* q = &x;
int* p = q;  /* void* automatically cast to int*: valid C, but not C++ */
int i = *p;
int j = *((int*)q); /* when dereferencing inline, there is no automatic casting */

C++ does not allow the automatic casting of void* to other pointer types, not even in assignments. This was a design decision to avoid careless and even unintended casts, though most compilers only output warnings, not errors, when encountering other ill casts.

Endret av JeffK
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...