¿Por qué recibo una advertencia cada vez que uso malloc?

110

Si uso mallocen mi código:

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

Recibo esta advertencia de gcc:

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

Respuestas:

224

Necesitas agregar:

#include <stdlib.h>

Este archivo incluye la declaración de la función incorporada malloc. Si no lo hace, el compilador cree que desea definir su propia función nombrada mallocy le advierte porque:

  1. No lo declaras explícitamente y
  2. Ya existe una función incorporada con ese nombre que tiene una firma diferente a la que se declaró implícitamente (cuando una función se declara implícitamente, se supone que sus tipos de retorno y argumento son int, lo cual no es compatible con la función incorporada in malloc, que toma size_tay devuelve a void*).
sepp2k
fuente
5
Terminología nit: no existe una función incorporada en C. malloc es simplemente una función de la biblioteca C estándar.
Jens
5
@Jens No veo ningún problema en referirme a las funciones estándar de la biblioteca como integradas, y tampoco las personas de gcc aparentemente, ya que el mensaje de error también usaba la palabra "integrado" (por eso lo hice).
sepp2k
7
@ sepp2k Bueno, hacer ver un problema. El uso no es estándar. Los compiladores pueden tener funciones integradas y gcc puede tener integrado malloc. Pero como escribí, en C , no hay funciones integradas.
Jens
30

No lo has hecho #include <stdlib.h>.

caos
fuente
16

Debe incluir el archivo de encabezado que declara la función, por ejemplo:

#include <stdlib.h>

Si no incluye este archivo de encabezado, el compilador no conoce la función. Entonces lo ve como no declarado.

andri
fuente
10

Adquiera el hábito de buscar sus funciones como ayuda.

La mayor parte de la ayuda para C se basa en las páginas del manual de Unix.

Utilizando :

man malloc

da resultados bastante útiles.

Buscar en Google man mallocte mostrará lo que quiero decir.

En Unix también obtienes a propósito para cosas que están relacionadas.

Tim Williscroft
fuente
1
Solo si ya sabe que la línea #include <stdlib.h>en la sinopsis significa que tiene que escribir eso en su programa.
Caracol mecánico
1
Si alguien ha leído las otras respuestas aquí, ahora lo sabrá.
MikeKulls
0

Además de las otras muy buenas respuestas, me gustaría hacer un pequeño detalle y cubrir algo que aún no se discute en las otras respuestas.


Cuando estás en Linux, para usar malloc()en tu código,

En realidad, no tienes que hacerlo #include <stdlib.h> .

(Aunque el uso de stdlib.hes muy común y probablemente todos los programas que no sean de juguete deberían incluirlo de cualquier manera porque proporciona una amplia gama de funciones y macros de biblioteca estándar de C útiles)

También podrías en su #include <malloc.h>lugar.

Pero tenga en cuenta que el uso de malloc.hestá obsoleto y hace que su código no sea portátil. Si desea utilizar malloc(), debe hacerlo siempre y siempre (excepto por razones explícitas para hacer lo contrario) #include <stdlib.h>.

Las razones por las cuales se explican mejor en las respuestas a esta pregunta:

diferencia entre <stdlib.h> y <malloc.h>

RobertS apoya a Monica Cellio
fuente