Dlaczego dostaję ostrzeżenie za każdym razem, gdy używam malloc?

110

Jeśli używam mallocw moim kodzie:

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

Otrzymałem to ostrzeżenie od gcc:

new.c:7: warning: implicit declaration of function malloc  
new.c:7: warning: incompatible implicit declaration of built-in function malloc
Kredns
źródło

Odpowiedzi:

224

Musisz dodać:

#include <stdlib.h>

Ten plik zawiera deklarację funkcji wbudowanej malloc. Jeśli tego nie zrobisz, kompilator pomyśli, że chcesz zdefiniować własną funkcję o nazwie malloci ostrzega Cię, ponieważ:

  1. Nie deklarujesz tego wyraźnie i
  2. Istnieje już funkcja wbudowana o tej nazwie, która ma inną sygnaturę niż ta, która została niejawnie zadeklarowana (gdy funkcja jest zadeklarowana niejawnie, zakłada się, że jej typy zwrotne i argumenty są int, co nie jest zgodne z wbudowaną in malloc, który przyjmuje a size_ti zwraca a void*).
sepp2k
źródło
5
Brak terminologii: Nie ma czegoś takiego jak funkcja wbudowana w C. malloc jest po prostu funkcją ze standardowej biblioteki C.
Jens,
5
@Jens Nie widzę problemu z określaniem standardowych funkcji bibliotecznych jako wbudowanych - podobnie jak ludzie z gcc najwyraźniej, ponieważ komunikat o błędzie również używał słowa „wbudowane” (dlatego to zrobiłem).
sepp2k
7
@ sepp2k Cóż, zrobić widzi problemu. Użycie jest niestandardowe. Kompilatory mogą mieć wbudowane funkcje, a gcc może mieć wbudowane malloc. Ale jak pisałem, w C nie ma wbudowanych funkcji.
Jens
30

Nie zrobiłeś #include <stdlib.h>.

chaos
źródło
16

Musisz dołączyć plik nagłówkowy, który deklaruje funkcję, na przykład:

#include <stdlib.h>

Jeśli nie dołączysz tego pliku nagłówkowego, funkcja nie jest znana kompilatorowi. Więc widzi to jako niezadeklarowane.

andri
źródło
10

Wyrób sobie nawyk sprawdzania funkcji w pomocy.

Większość pomocy dla C jest wzorowana na stronach podręcznika systemowego unix.

Za pomocą :

man malloc

daje całkiem przydatne wyniki.

Googling man mallocpokaże ci, co mam na myśli.

W unixie otrzymujesz również odpowiednie dla rzeczy, które są ze sobą powiązane.

Tim Williscroft
źródło
1
Tylko jeśli już wiesz, że wiersz #include <stdlib.h>w streszczeniu oznacza, że ​​musisz to napisać w swoim programie.
Mechaniczny ślimak
1
Jeśli ktoś przeczytał tutaj inne odpowiedzi, będzie to wiedział.
MikeKulls
0

Oprócz innych bardzo dobrych odpowiedzi, chciałbym poszukać czegoś, co nie zostało jeszcze omówione w pozostałych odpowiedziach.


Kiedy jesteś w Linuksie, aby użyć malloc()w swoim kodzie,

Właściwie nie musisz #include <stdlib.h> .

(Chociaż użycie stdlib.hjest bardzo powszechne i prawdopodobnie każdy program inny niż zabawka powinien zawierać go w obu przypadkach, ponieważ zapewnia szeroką gamę przydatnych funkcji i makr w standardowej bibliotece C)

Możesz też #include <malloc.h>zamiast tego.

Pamiętaj jednak, że użycie rozszerzenia malloc.hjest przestarzałe i sprawia, że ​​Twój kod nie jest przenośny. Jeśli chcesz używać malloc(), powinieneś zawsze i zawsze (z wyjątkiem wyraźnych powodów, aby zrobić inaczej) #include <stdlib.h>.

Powody tego najlepiej wyjaśniają odpowiedzi na to pytanie:

różnica między <stdlib.h> i <malloc.h>

RobertS wspiera Monikę Cellio
źródło