Динамическое выделение памяти - очень важная тема в C. Оно позволяет создавать сложные структуры данных, такие как связанные списки. Динамическое распределение памяти помогает нам хранить данные, не зная изначально размер данных во время написания программы.
Чтобы выделить кусок памяти динамически, у нас должен быть указатель, готовый сохранить местоположение вновь выделенной памяти. Мы можем получить доступ к памяти, которая была выделена нам, используя тот же указатель, и мы можем использовать этот указатель, чтобы снова освободить память, как только мы закончили ее использовать.
Предположим, мы хотим динамически выделить структуру person. Человек определяется так:
typedef struct {
char * name;
int age;
} person;
Чтобы выделить нового человека в myperson
аргументе, мы используем следующий синтаксис:
person * myperson = (person *) malloc(sizeof(person));
Это сообщает компилятору, что мы хотим динамически выделить достаточно, чтобы удерживать структуру человека в памяти, а затем вернуть указатель типа person
на вновь выделенные данные. Причина, по которой мы пишем перед вызовом, заключается в том, что возвращает «указатель void», то есть указатель, не имеющий типа. Запись перед ним называется приведением типов и изменяет тип возвращаемого указателя на . Однако нет строгой необходимости писать его таким образом, поскольку C неявно преобразует тип возвращаемого указателя в тип указателя, которому он назначен (в данном случае ), если вы не приведете его тип .(person *)
malloc()
malloc()
(person *)
malloc()
person
myperson
Обратите внимание, что sizeof
это не фактическая функция, потому что компилятор интерпретирует ее и преобразует в фактический размер памяти структуры человека.
Чтобы получить доступ к членам человека, мы можем использовать ->
обозначение:
myperson->name = "John";
myperson->age = 27;
После того, как мы закончили использовать динамически выделяемую структуру, мы можем освободить ее, используя free
:
free(myperson);
Обратите внимание, что free не удаляет myperson
саму переменную, он просто освобождает данные, на которые она указывает. myperson
Переменная будет по- прежнему указывают на где - то в памяти - но после вызова myperson
мы не имеем права доступа , что площадь больше. Мы не должны использовать этот указатель снова, пока не выделим с его помощью новые данные.
Используется malloc
для динамического выделения точечной структуры.