Во-первых, чтобы ответить на ваш вопрос о сбое, я думаю, причина того, что вы получаете ошибку сегментации, заключается в том, что вам не удалось умножить len
на sizeof(token)
при вызове realloc
.Вы заканчиваете тем, что пишете после конца блока, который был выделен, в конечном счете вызывая segfault.
Доходит "решение освободить объект и когда [...] сохранить объект", Cне решает ничего за вас: он просто делает это, когда вы говорите об этом по телефону free
, не задавая вам никаких дополнительных вопросов.Это «послушание» иногда приводит к тому, что вы стоите, потому что вы можете случайно освободить то, что вам все еще нужно.Хорошей идеей будет обнулить указатель, чтобы улучшить ваши шансы на быстрое обнаружение проблемы (к сожалению, этого недостаточно для полного устранения проблемы из-за общих указателей).
free(h->arr);
h -> arr = NULL; // Doing this is a good practice
Подводя итогУправление памятью в C - утомительная задача, требующая много размышлений и дисциплины.Вам нужно проверить результат каждого вызова распределения, чтобы увидеть, не произошел ли он, и выполнить много вспомогательных задач, когда это произойдет.