Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика 1.docx
Скачиваний:
11
Добавлен:
26.09.2019
Размер:
364.88 Кб
Скачать

Статическое и динамическое выделение памяти.

Выделение памяти под переменные и массивы бывает статическим и динамическим.

Статическое выделение памяти – выделение памяти, при котором размер выделяемой памяти известен ещё на этапе компиляции. При статическом выделении памяти операции выделения и освобождения памяти встраиваются в программу компилятором автоматически. Программисту достаточно лишь объявить переменную или массив, в этом же месте программы под неё будет выделена память.

Например,

void func()

{

int i; // здесь выделяется 4 байта под переменную i

char ac[10]; // здесь выделяется 10 байт под массив ac

} // конец функции, здесь освобождается память из-под всех

// локальных переменных и массивов

Динамическое выделение памяти – выделение памяти в ходе работы программы, обычно используется в случаях, когда заранее неизвестен объём необходимой памяти. В случае динамического выделения памяти ответственность за выделение и освобождение памяти лежит на программисте. Неправильное выделение или освобождение памяти может привести к серьёзным последствиям вплоть до перезагрузки операционной системы (в некоторых ОС).

Доступ к динамически выделенной памяти осуществляется с помощью указателей. При этом выделенную область часто называют динамическим массивом из-за схожести методов работы с массивами и методов работы с динамически выделенной памятью.

Управление динамическим выделением памяти осуществляется с помощью функций, описанных в файле alloc.h:

  • calloc

  • malloc

  • realloc

  • free

Функции calloc, malloc, free

Функция void* calloc(size_t nitems, size_t size); динамически выделяет блок памяти размером nitems * size. Блок инициализируется нулями. Функция calloc возвращает указатель на выделенный блок в случае успешного выделения памяти, иначе calloc возвращает NULL ( например, если недостаточно памяти для выделения нового блока или в случае иных ошибок). Прототипы функции описаны в stdlib.h, alloc.h.

Функция void* malloc(size_t size); динамически выделяет блок памяти, размером size байт. Инициализация содержимого блока не производится. Возвращаемое значение полностью аналогично возвращаемому значению функции calloc. Прототипы функции описаны в stdlib.h, alloc.h.

Функция void free(void* block); освобождает блок памяти, выделенный функциями calloc, malloc или realloc. В качестве параметра block ей передаётся указатель на освобождаемый блок памяти.

Пример:

#include <alloc.h>

void main()

{

long *pl;

short *ps;

int i;

//Выделяем память под динамические массивы.

//В calloc передаём количество элементов и размер элемента.

//В malloc передаём полный размер выделяемого блока в

//байтах.

pl=calloc(10,sizeof(long));

ps=malloc(10*sizeof(short));

if(pl && ps) // если оба указателя не равны NULL (0)

{

// память выделена, можем с ней работать

for(i=0;i<10;i++)

{

pl[i]=i*2;

ps[i]=i*2+1;

}

// В конце работы освобождаем память,

// на которую указывают pl и ps.

free(pl);

free(ps);

}

else

{

printf("Недостаточно памяти\n");

}

}