Нет, вы не можете сделать free(a+4)
и т. Д.
Почему?Потому что стандарт С запрещает это.Вы должны передать точный указатель, возвращенный malloc()
в free()
без какой-либо арифметики указателя.
Почему стандарт запрещает это?Это связано с тем, что в некоторых реализациях malloc()
информация заголовка хранится в месте a-4
(или где-либо еще), а free()
внутренне считывает ее с помощью арифметики указателя.Если ему дан смещенный указатель, такой как a+4
, он пропустит информацию заголовка и будет испорчен.См.
Кстати, некоторые реализации libc предоставляют нестандартные функциикоторые возвращают размер выделенного фрагмента памяти:
Если вам интересно, как они реализованы, и загляните в их исходный код, вы часто обнаруживаете, что они читают информацию заголовка в a-4
и т. Д .:
ОК, вернемся к исходному вопросу. Если вы хотите сократить (или удлинить) блок памяти, выделенный вам malloc()
, вы можете использовать realloc()
, как сказал @Gustav.Но если вы хотите удалить несколько байтов из середины блока памяти, вам нужно перераспределить и скопировать вручную.На самом деле realloc()
может внутренне выполнять аналогичную работу, поэтому будьте осторожны с возвращенным указателем, который может отличаться от исходного.