Сколько байтов будет освобождено с помощью free () после изменения указателя? - PullRequest
0 голосов
/ 27 мая 2018

У меня есть следующий фрагмент кода.

char* p = malloc(10);
p = p + 1;
free(p);

В приведенном выше коде

  1. Как malloc возвращает адрес памяти при вызове malloc (10)?
  2. Сколько байтов будет освобождено free (p) ?
  3. Как free () знает, сколько байтов должно быть освобождено?

1 Ответ

0 голосов
/ 27 мая 2018

Как скажет справочная страница для free, любой аргумент, кроме указателя, возвращенного из malloc, имеет неопределенное поведение:

Функция free () освобождает пространство памяти, на которое указываетptr, который должен был быть возвращен предыдущим вызовом malloc (), calloc () или realloc ().В противном случае или, если free (ptr) уже был вызван ранее, происходит неопределенное поведение.Если ptr равен NULL, никакие операции не выполняются

Относительно того, как free знает размер блока: типичная реализация распределителя памяти имеет заголовок для каждого блока (содержащий размер, указатели freelist и т. Д.) и free знает размер этого заголовка и смещение от указателя, возвращаемое malloc.

Это также отвечает на ваш первый вопрос: malloc выделяет такой блок и возвращает указатель на началофактического объекта.

...