Когда ты вызываешь функцию free(), ей нужно знать, сколько памяти освободить. Эта информация хранится в заголовке malloc — скрытой структуре метаданных, которая располагается перед каждым выделенным блоком.
На системах Linux заголовок malloc обычно занимает 4 байта прямо перед адресом памяти, который возвращается указателю. В этом заголовке хранится общий размер выделенного блока, включая сам заголовок.
Рассмотри такое выделение:
int *i = (int *)malloc(12);
Процесс выделения памяти работает так:
i указывает на байт 5 (после заголовка)free() использует эту информациюКогда ты вызываешь free(i):
(i - 4) и получает размер выделенияУказатель, который ты получаешь, не указывает на начало выделенного блока — он указывает на первый доступный байт после заголовка с метаданными. Такой подход позволяет free() определить точный размер блока без необходимости передавать его явно, делая управление памятью в C одновременно гибким и эффективным.
Заголовок malloc хранится непосредственно перед адресом возвращаемого указателя и содержит общий размер выделенного блока, включая сам заголовок.
Новый — ещё не проверен сообществом
Вы