Perché ricevo un avviso ogni volta che utilizzo malloc?


110

Se utilizzo mallocnel mio codice:

int *x = malloc(sizeof(int));

Ricevo questo avviso da gcc:

new.c:7: warning: implicit declaration of function malloc  
new.c:7: warning: incompatible implicit declaration of built-in function malloc

Risposte:


224

Devi aggiungere:

#include <stdlib.h>

Questo file include la dichiarazione per la funzione incorporata malloc. Se non lo fai, il compilatore pensa che tu voglia definire la tua funzione chiamata malloce ti avverte perché:

  1. Non lo dichiari esplicitamente e
  2. Esiste già una funzione incorporata con quel nome che ha una firma diversa da quella dichiarata implicitamente (quando una funzione viene dichiarata implicitamente, si presume che siano i suoi tipi di ritorno e argomento int, il che non è compatibile con il in malloc, che prende a size_te restituisce a void*).

5
Terminologia nit: non esiste una funzione incorporata in C. malloc è semplicemente una funzione della libreria standard C.
Jens

5
@ Jens Non vedo alcun problema nel riferirmi alle funzioni di libreria standard come built-in - e nemmeno le persone gcc apparentemente poiché il messaggio di errore utilizzava anche la parola "built-in" (motivo per cui l'ho fatto).
sepp2k

7
@ sepp2k Beh, mi fa vedere un problema. L'utilizzo non è standard. I compilatori possono avere funzioni integrate e gcc potrebbe avere malloc integrato. Ma come ho scritto, in C , non ci sono funzioni integrate.
Jens

30

Non l'hai fatto #include <stdlib.h>.


16

È necessario includere il file di intestazione che dichiara la funzione, ad esempio:

#include <stdlib.h>

Se non includi questo file di intestazione, la funzione non è nota al compilatore. Quindi lo vede come non dichiarato.


10

Prendi l'abitudine di cercare le tue funzioni in aiuto.

La maggior parte dell'aiuto per C è modellato sulle pagine di manuale di Unix.

Utilizzando:

man malloc

dà risultati piuttosto utili.

Googling man mallocti mostrerà cosa intendo.

In unix ottieni anche approcci per le cose che sono correlate.


1
Solo se sai già che la riga #include <stdlib.h>nella sinossi significa che devi scriverla nel tuo programma.
Lumaca meccanica

1
Se qualcuno ha letto le altre risposte qui, ora lo saprà.
MikeKulls

0

Oltre alle altre risposte molto buone, vorrei fare un piccolo pignolo e coprire qualcosa che non è ancora discusso nelle altre risposte.


Quando sei su Linux, da usare malloc()nel tuo codice,

Si Non tiratevi realmente necessario #include <stdlib.h> .

(Sebbene l'uso di stdlib.hsia molto comune e probabilmente ogni programma non giocattolo dovrebbe includerlo in entrambi i casi perché fornisce una vasta gamma di utili funzioni e macro della libreria standard C)

Potresti anche #include <malloc.h>invece.

Ma tieni presente che l'uso di malloc.hè deprecato e rende il tuo codice non portabile. Se vuoi usarlo malloc()dovresti sempre e sempre (salvo espliciti motivi per fare diversamente) #include <stdlib.h>.

I motivi per cui sono meglio spiegati nelle risposte a questa domanda:

differenza tra <stdlib.h> e <malloc.h>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.