Динамическое размещение


Динамическое выделение памяти - очень важная тема в C. Оно позволяет создавать сложные структуры данных, такие как связанные списки. Динамическое распределение памяти помогает нам хранить данные, не зная изначально размер данных во время написания программы.

Чтобы выделить кусок памяти динамически, у нас должен быть указатель, готовый сохранить местоположение вновь выделенной памяти. Мы можем получить доступ к памяти, которая была выделена нам, используя тот же указатель, и мы можем использовать этот указатель, чтобы снова освободить память, как только мы закончили ее использовать.

Предположим, мы хотим динамически выделить структуру person. Человек определяется так:

typedef struct {
    char * name;
    int age;
} person;

Чтобы выделить нового человека в mypersonаргументе, мы используем следующий синтаксис:

person * myperson = (person *) malloc(sizeof(person));

Это сообщает компилятору, что мы хотим динамически выделить достаточно, чтобы удерживать структуру человека в памяти, а затем вернуть указатель типа personна вновь выделенные данные. Причина, по которой мы пишем перед вызовом, заключается в том, что возвращает «указатель void», то есть указатель, не имеющий типа. Запись перед ним называется приведением типов и изменяет тип возвращаемого указателя на . Однако нет строгой необходимости писать его таким образом, поскольку C неявно преобразует тип возвращаемого указателя в тип указателя, которому он назначен (в данном случае ), если вы не приведете его тип .(person *)malloc()malloc()(person *)malloc()personmyperson

Обратите внимание, что sizeofэто не фактическая функция, потому что компилятор интерпретирует ее и преобразует в фактический размер памяти структуры человека.

Чтобы получить доступ к членам человека, мы можем использовать ->обозначение:

myperson->name = "John";
myperson->age = 27;

После того, как мы закончили использовать динамически выделяемую структуру, мы можем освободить ее, используя free:

free(myperson);

Обратите внимание, что free не удаляет mypersonсаму переменную, он просто освобождает данные, на которые она указывает. mypersonПеременная будет по- прежнему указывают на где - то в памяти - но после вызова mypersonмы не имеем права доступа , что площадь больше. Мы не должны использовать этот указатель снова, пока не выделим с его помощью новые данные.

Упражнение

Используется mallocдля динамического выделения точечной структуры.