ДИНАМИЧЕСКОЕ ВЫДЕЛЕНИЕ ПАМЯТИ.


До сих пор в программа использовались переменные и массивы, создаваемые компилятором языка. Однако при этом не рационально расходуется память. 
В отличие от статических и автоматических данных, память под которые распределяется компилятором, динамически распределяемая память выделяется программой самостоятельно. Время жизни таких объектов также определяется программой. Память выделяется по мере необходимости и должна освобождаться как только данные, содержащиеся в ней больше не нужны. Доступ к ней осуществляется при помощи указателей.
Функции создания динамических переменных и массивов объявлены в заголовочных файлах <allos.h>, <stdlib.h>.

1. Функция void* malloc(размер) — выделяет в «куче» n байтов и возвращает указатель на 1-й байт, иначе возвращает 0. Необходимо делать преобразование типов.

void main(void){
char *original=”Исходная строка”;
char *copy;
copy=(char*)malloc(strlen(original)+1);
if(copy==NULL) {
puts(“Ошибка выделения памяти”);
exit(1);
}
strcpy(copy,original);
cout<<copy<<endl; cout<<original<<endl;
free(copy);
}
При выделении памяти она не очищается. Размер указывается в бай-тах.
2. Функция void* calloc(n,size type);
long* newmas = (long*)calloc(100,sizeof(long));
первый параметр — количество требуемых ячеек памяти;
второй параметр — размеp каждой ячейки.
Функция calloc() обнуляет выделенную память.

#define SIZE 128
void main(void) {
char *str=(char *)calloc(1,SIZE);
if(str==NULL) {
puts(“Ошибка выделения памяти”);
exit(1);
}
else {
cout<<”Введите строку”;
gets(str);
cout<<str;
free(s);
}
}
3. void* realloc() — изменяет размер ранее выделенного блока памяти. Если дополнительная память выделяется в новом месте оперативной памяти, то уже введенная информация переписывается в новое место.
ptr = realloc(nptr, size);
где nptr — указатель на ранее выделенный блок; size размер выделяемой дополнительной памяти.

void main(void) {
char *p1, *p2;
puts(«Выделяем 128 байт»);
p1=malloc(128);
if(p1) {
puts(“Изменяем размер блока на 256 байтов”);
p2=realloc(p1,256); //блок теперь равен 256 байтам
}
if(p2)
free(p2);
else
free(p1);
}
1. void free(ptr) — освобождение выделенной памяти. Количество
выделенной динамически памяти не может превышать 64 Кбайта — размера одного сектора.

Загрузка...