мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| c:c_ultimate_guide:stdlib.h [2025/10/29 15:06] – создано radi0dev | c:c_ultimate_guide:stdlib.h [2025/11/09 12:07] (текущий) – внешнее изменение A User Not Logged in | ||
|---|---|---|---|
| Строка 4: | Строка 4: | ||
| ==== malloc ==== | ==== malloc ==== | ||
| + | |||
| + | прототип: | ||
| Функция malloc() выделяет память длиной для определенного количества байт и возвращает указатель на начало выделенной памяти. Через полученный указатель мы можем помещать данные в выделенную память. Рассмотрим простой пример: | Функция malloc() выделяет память длиной для определенного количества байт и возвращает указатель на начало выделенной памяти. Через полученный указатель мы можем помещать данные в выделенную память. Рассмотрим простой пример: | ||
| Строка 77: | Строка 79: | ||
| </ | </ | ||
| ++++ | ++++ | ||
| + | |||
| + | ==== calloc ==== | ||
| + | |||
| + | прототип: | ||
| + | |||
| + | Она выделяет память для n элементов по m байт каждый и возвращает указатель на начало выделенной памяти. В случае неудачного выполнения возвращает NULL | ||
| + | |||
| + | В отличие от функции malloc() она инициализирует все выделенные байты памяти нулями. | ||
| + | |||
| + | ==== realloc ==== | ||
| + | |||
| + | прототип: | ||
| + | |||
| + | Первый параметр представляет указатель на ранее выделенный блок памяти. А второй параметр представляет новый размер блока памяти в байтах. | ||
| + | |||
| + | Если указатель bl имеет значение NULL, то действие функции аналогично действию malloc | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | int main(void) { | ||
| + | // выделяем память для 1-го объекта int | ||
| + | int size = sizeof(int); | ||
| + | int *ptr = malloc(size); | ||
| + | if(ptr) { | ||
| + | // отображаем адрес и размер памяти | ||
| + | printf(" | ||
| + | } | ||
| + | // расширяем память до размера 4-х объектов int | ||
| + | size = 4 * sizeof(int); | ||
| + | int *ptr_new = realloc(ptr, | ||
| + | // если выделение памяти прошло успещно | ||
| + | if(ptr_new) { | ||
| + | printf(" | ||
| + | // заново отображаем адрес и размер памяти | ||
| + | printf(" | ||
| + | free(ptr_new); | ||
| + | } else { | ||
| + | free(ptr); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== free ==== | ||
| + | |||
| + | Имеет прототип: | ||
| + | |||
| + | Освобождает ранее выделенный блок памяти, | ||
| + | |||
| + | Расмотрим, | ||
| + | * Указатель определен в блоке кода. В этом случае указатель будет доступен только в пределах данного блока кода. Соответственно память необходимо освобождать при выходе из этого блока. | ||
| + | * Указатель определен как статический объект. В этом случае динамическая память выделяется один раз и доступна через указатель при каждом повторном входе блок. В этом случае память нужно освобождать только после завершения ее использования. | ||
| + | * Указатель является глобальным объектом по отношению к блоку. В этом случае динамическая память доступна во всех блоках, | ||
| + | |||