Pourquoi est-ce que je reçois un avertissement chaque fois que j'utilise malloc?

110

Si j'utilise mallocdans mon code:

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

Je reçois cet avertissement de gcc:

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

Réponses:

224

Vous devez ajouter:

#include <stdlib.h>

Ce fichier comprend la déclaration de la fonction intégrée malloc. Si vous ne le faites pas, le compilateur pense que vous voulez définir votre propre fonction nommée mallocet il vous avertit car:

  1. Vous ne le déclarez pas explicitement et
  2. Il existe déjà une fonction intégrée de ce nom qui a une signature différente de celle qui a été implicitement déclarée (lorsqu'une fonction est déclarée implicitement, ses types de retour et d'argument sont supposés être int, ce qui n'est pas compatible avec le in malloc, qui prend a size_tet renvoie a void*).
sepp2k
la source
5
Terminologie nit: Il n'existe pas de fonction intégrée dans C. malloc est simplement une fonction de la bibliothèque C standard.
Jens
5
@Jens Je ne vois pas de problème à faire référence aux fonctions de bibliothèque standard comme des fonctions intégrées - et les gens de gcc ne le font pas non plus apparemment puisque le message d'erreur utilisait également le mot "intégré" (c'est pourquoi je l'ai fait).
sepp2k
7
@ sepp2k Eh bien, je ne vois un problème. L'utilisation n'est pas standard. Les compilateurs peuvent avoir des fonctions intégrées, et gcc peut avoir malloc intégré. Mais comme je l'ai écrit, en C , il n'y a pas de fonctions intégrées.
Jens
30

Vous ne l'avez pas fait #include <stdlib.h>.

le chaos
la source
16

Vous devez inclure le fichier d'en-tête qui déclare la fonction, par exemple:

#include <stdlib.h>

Si vous n'incluez pas ce fichier d'en-tête, la fonction n'est pas connue du compilateur. Il considère donc cela comme non déclaré.

andri
la source
10

Prenez l'habitude de rechercher de l'aide dans vos fonctions.

La plupart de l'aide pour C est calquée sur les pages de manuel Unix.

En utilisant :

man malloc

donne des résultats assez utiles.

Googler man mallocvous montrera ce que je veux dire.

Dans unix, vous obtenez également des points à propos des éléments liés.

Tim Williscroft
la source
1
Seulement si vous savez déjà que la ligne #include <stdlib.h>dans le synopsis signifie que vous devez écrire cela dans votre programme.
Escargot mécanique
1
Si quelqu'un a lu les autres réponses ici, il le saura maintenant.
MikeKulls
0

À côté des autres très bonnes réponses, je voudrais faire un petit pinaillage et couvrir quelque chose qui n'est pas encore discuté dans les autres réponses.


Lorsque vous êtes sous Linux, à utiliser malloc()dans votre code,

Vous n'êtes pas obligé de le faire #include <stdlib.h> .

(Bien que l'utilisation de stdlib.hsoit très courante et que chaque programme non-jouet devrait probablement l'inclure de toute façon car il fournit un large éventail de fonctions et de macros de bibliothèque standard C utiles)

Vous pourriez aussi à la #include <malloc.h>place.

Mais veuillez noter que l'utilisation de malloc.hest obsolète et que votre code n'est pas portable. Si vous souhaitez utiliser, malloc()vous devriez toujours et toujours (sauf pour des raisons explicites de faire autrement) #include <stdlib.h>.

Les raisons pour lesquelles , sont mieux expliquées dans les réponses à cette question:

différence entre <stdlib.h> et <malloc.h>

RobertS soutient Monica Cellio
la source