Адресное пространство выделяется приложением из ОС.Эти распределения имеют гранулярность, которая является функцией аппаратного обеспечения, операционной системы и параметров библиотеки malloc.Немногие архитектуры имеют побайтовую гранулярность.
Malloc обычно не является интерфейсом операционной системы, скорее это очень удобная библиотека, построенная на менее сложных механизмах.Malloc определяет, какую гранулярность он хочет увеличить и уменьшить адресное пространство, и создает структуры данных для отслеживания памяти в удобном для нее размере.Например, он может никогда не вернуть объект размером менее 64 байт.Вы могли бы определить это, используя realloc: выделить набор небольших объектов (скажем, 1 байт) и найти два ближайших друг к другу адреса, а затем вызвать grow () ниже с нижним указателем, и эторазница.Возможно, у вас нетрадиционный malloc, и это не сработает ....
int grow(void *p, int maxdiff) {
int i;
for (i = 2; i < maxdiff; i++) {
void *t = realloc(p, i);
if (t != p) {
return i;
}
}
return -1;
}
Для хорошего учебника по malloc () прочитайте и поймите реализацию этого в K & R "The CЯзык программирования ".