1) Обычно память выделяется несколькими страницами, поэтому, если запрошенный вами размер меньше, чем страница, malloc выделит хотя бы одну страницу.
2) Это имеет смысл, поскольку в многозадачной системе вы не единственный пользователь, и ваш процесс - не единственный запущенный процесс, есть много других процессов, которые совместно используют ограниченный набор ресурсов, включая память. Если ОС позволяла одному процессу распределять всю необходимую память без каких-либо ограничений, то это не совсем хорошая ОС, верно?
Наконец, в Linux ядро не выделяет никаких страниц физической памяти до тех пор, пока вы фактически не начнете использовать эту память, поэтому простой вызов malloc фактически не потребляет физической памяти, кроме той, которая требуется для отслеживания Само выделение конечно. Я не уверен насчет Windows.
Edit:
В следующем примере выделяется 1 ГБ виртуальной памяти
#include <stdio.h>
int main(int agrc, char **argv)
{
void *p = malloc(1024*1024*1024);
getc(stdin);
}
Если вы бежите сверху, вы получаете
top -p `pgrep test`
PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20 0 1027m 328 252 S 0 0.0 0:00.00 test
Если вы измените malloc на calloc и снова запустите top, вы получите
top -p `pgrep test`
PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20 0 1027m 1.0g 328 S 0 1.3 0:00.08 test