Por que recebo um aviso sempre que uso o malloc?

110

Se eu usar mallocem meu código:

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

Recebo este aviso de gcc:

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

Respostas:

224

Você precisa adicionar:

#include <stdlib.h>

Este arquivo inclui a declaração da função embutida malloc. Se você não fizer isso, o compilador pensa que você deseja definir sua própria função chamada malloce avisa porque:

  1. Você não o declara explicitamente e
  2. Já existe uma função incorporada com esse nome que tem uma assinatura diferente daquela que foi declarada implicitamente (quando uma função é declarada implicitamente, seus tipos de retorno e argumento são considerados int, o que não é compatível com o in malloc, que recebe a size_te retorna a void*).
sepp2k
fonte
5
Terminologia nit: Não existe uma função incorporada em C. malloc, é simplesmente uma função da Biblioteca C padrão.
Jens
5
@Jens Não vejo problema em se referir a funções de biblioteca padrão como integradas - e nem o pessoal do gcc, aparentemente, já que a mensagem de erro também usou a palavra "integrada" (é por isso que usei).
sepp2k
7
@ sepp2k Bem, eu fazer ver um problema. O uso não é padrão. Compiladores podem ter funções integradas e o gcc pode ter malloc integrado. Mas, como escrevi, em C , não há funções integradas.
Jens
30

Você não fez #include <stdlib.h>.

caos
fonte
16

Você precisa incluir o arquivo de cabeçalho que declara a função, por exemplo:

#include <stdlib.h>

Se você não incluir este arquivo de cabeçalho, a função não será conhecida do compilador. Portanto, ele o vê como não declarado.

andri
fonte
10

Crie o hábito de procurar suas funções no help.

A maior parte da ajuda para C é modelada nas páginas de manual do Unix.

Usando:

man malloc

dá resultados bastante úteis.

Googling man mallocvai mostrar o que quero dizer.

No Unix, você também obtém informações sobre coisas relacionadas.

Tim Williscroft
fonte
1
Somente se você já sabe que a linha #include <stdlib.h>na sinopse significa que você deve escrever isso em seu programa.
Caracol mecânico de
1
Se alguém leu as outras respostas aqui, agora saberá disso.
MikeKulls
0

Além de outras respostas muito boas, eu gostaria de fazer um pequeno detalhamento e cobrir algo que ainda não foi discutido nas outras respostas.


Quando você está no Linux, para usar malloc()em seu código,

Você realmente não precisa #include <stdlib.h> .

(Embora o uso de stdlib.hseja muito comum e provavelmente todo programa que não seja de brinquedo deva incluí-lo de qualquer maneira, porque ele fornece uma ampla gama de funções e macros de biblioteca padrão C úteis)

Você também pode #include <malloc.h>.

Mas observe que o uso de malloc.hestá obsoleto e torna seu código não portátil. Se você quiser usar, malloc()deve sempre e sempre (exceto por razões explícitas para fazer o contrário) #include <stdlib.h>.

As razões por que , são melhor explicados nas respostas a esta pergunta:

diferença entre <stdlib.h> e <malloc.h>

RobertS apoia Monica Cellio
fonte