Depends on your implementation.
Code:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *p1, *p2, *p3;
p1 = malloc( sizeof(int) );
p2 = malloc( sizeof(int) );
p3 = malloc( sizeof(int) );
printf( "%p %p %p\n", (void*)p1, (void*)p2, (void*)p3 );
return 0;
}
$ gcc -W -Wall -ansi -pedantic foo.c
$ ./a.exe
0x660160 0x660170 0x660180
> cl /nologo foo.c
foo.c
> foo.exe
00320758 00320770 00320788
16 for cygwin/gcc, 24 for VC6.
The amount allocated is can be aligned to some boundary.
There is also the memory pool management overhead which keeps track of all the blocks.