42 lines
3.5 KiB
Markdown
42 lines
3.5 KiB
Markdown
---
|
||
title: malloc
|
||
localeTitle: malloc
|
||
---
|
||
# malloc в C
|
||
|
||
malloc() - это библиотечная функция, которая позволяет C динамически выделять память из кучи. Куча - это область памяти, реализующая динамическое хранение с ручным управлением.
|
||
|
||
malloc() является частью stdlib.h и для его использования вам необходимо подключить `#include <stdlib.h>` .
|
||
|
||
## Использование malloc
|
||
|
||
malloc() выделяет память запрошенного размера и возвращает указатель на начало выделенного блока. Чтобы запомнить этот возвращенный указатель, мы должны создать переменную. Давайте создадим указатель на пока не существующий массив целых чисел (тип int).
|
||
|
||
```C
|
||
int* arrayPtr;
|
||
```
|
||
|
||
Результат malloc будет автоматически приведен к используемому нами типу указателя. В отличие от других языков, C не знает тип данных, на который он выделяет память; malloc знает лишь количество байт, который необходимо выделить. К счастью, в C есть функция `sizeof()`, которая может нам помочь.
|
||
|
||
```C
|
||
arrayPtr = malloc(10 * sizeof(int));
|
||
```
|
||
|
||
Этот оператор использует malloc для выделения памяти для массива из 10 целых чисел. Поскольку размеры могут различаться на разных компьютерах, важно использовать функцию sizeof() для вычисления размера на текущем компьютере.
|
||
|
||
Память, выделенная во время выполнения программы, должна быть освобождена до ее закрытия. Чтобы освободить память, используется функция free()
|
||
|
||
```C
|
||
free( arrayPtr );
|
||
```
|
||
|
||
Этот оператор освободит ранее выделенную память. В C нет встроенного сборщика мусора, как в некоторых других языках, напр. в Java. В результате память, которая не была должным образом освобождена, будет оставаться выделенной после закрытия программы.
|
||
|
||
# Прежде чем продолжить ...
|
||
|
||
## Обзор
|
||
|
||
* malloc используется для динамического выделения памяти и полезен, когда вы во время компиляции не знаете объем памяти, который будет необходим.
|
||
* Выделение памяти позволяет объектам существовать за пределами текущего блока.
|
||
* C передает значение вместо ссылки. Использование malloc для назначения памяти с последующей передачей указателя в другую функцию более эффективно нежели воссоздание этой структуры в самой функции.
|