Для этого нет готовой функции, но сделать это не невозможно.Во-первых, существует realloc () . realloc принимает указатель на блок памяти и изменяет размер выделения до указанного размера.
Теперь, если вы выделили немного памяти:
char * tmp = malloc(2048);
и намереваетесь освободить первую 1 КБ памяти, вы можете сделать:
tmp = realloc(foo, 2048-1024);
Однако проблема в этом случае заключается в том, что вы не можете быть уверенными , что tmp
останется неизменным.Так как функция может просто освободить всю память 2K и переместить ее в другое место.
Теперь я не уверен насчет точной реализации realloc , но, насколько я понимаю, код:
myptr = malloc( x - y );
на самом деле malloc
sa новая памятьбуфер размером x-y
, затем он копирует байтов, которые соответствуют, используя memcpy
и, наконец, free
s исходной выделенной памяти.
Это может создать некоторые потенциальные проблемы.Например, новая перераспределенная память может быть расположена по другому адресу, поэтому любые предыдущие указатели, которые вы могли иметь, могут стать недействительными.Это приводит к неопределенным ошибкам во время выполнения, ошибкам сегментации и общему отладочному аду.Поэтому я постараюсь не прибегать к этому.