Существует возможность, если вы не хотите помнить, чтобы позвонить free(abc.links)
, и если size
не изменится за время существования объекта:
struct abc
{
int size;
struct abc *links[0]; // use 1 if your compiler complains
}
( Примечание. Этот специальный массив нулевой длины должен быть последним членом структуры )
Как может помочь массив нулевой длины? Это работает, если вы выделите abc с
struct abc * a = malloc(sizeof(abc)+ size * sizeof(struct abc *));
Это намеренно создает слишком много памяти, чтобы мы могли затем безопасно использовать a-> links [3] или a-> link [4] (при условии, что мы не забываем соблюдать size
. Затем мы можем просто использовать free(a)
, нам не нужно (и мы не можем) free(a->links);
.
В любом случае, не забудьте освободить каждый из a->links[0]
и a->links[1]
и т. Д. До a->links[a->size - 1]
, прежде чем пытаться освободить a
.