difference between <stdlib.h> and <malloc.h>

none picture none · Oct 19, 2012 · Viewed 67.3k times · Source

When I use malloc in a C program, I get a warning:

warning: incompatible implicit declaration of built-in function 'malloc' [enabled by default]

I can then include <malloc.h> or <stdlib.h> to get rid of the warning although it works without it as well.

So I was wondering, what's the difference between these headers and which one does gcc links when I don't include anything?

(I'm using ubuntu 12.04 64-bit with gcc 4.6.3)

Answer

Basile Starynkevitch picture Basile Starynkevitch · Oct 19, 2012

The <malloc.h> header is deprecated (and quite Linux specific, on which it defines non-standard functions like mallinfo(3)). Use <stdlib.h> instead if you simply need malloc(3) and related standard functions (e.g. free, calloc, realloc ....). Notice that <stdlib.h> is defined by C89 (and later) standards, but not <malloc.h>

Look into /usr/include/malloc.h you'll find there some non-standard functions (e.g. malloc_stats(3), etc...) - in addition of malloc....

And gcc don't link header files, but libraries. Read Levine's book about linkers & loaders for more.

If you don't include any headers (and dont explicitly declare malloc yourself, which would be a bad idea), malloc is implicitly declared as returning some int value (which is wrong). I do invite you to pass at least the -Wall flag to gcc when using it.

You might also pass -v to gcc to understand the actual programs involved: cc1 is the compiler proper (producing assembly code), as the assembler, ld the linker, and collect2 an internal utility which invokes the linker.