Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
.doc
Скачиваний:
4
Добавлен:
23.09.2019
Размер:
440.83 Кб
Скачать

25) Функции динамического распределения памяти (в1б25, в2б21)

Основу системы динамического распределения в С составляют функции malloc() и free(). Эти функции работают совместно. Функция malloc() выделяет память, а free() — освобождает ее. Это значит, что при каждом запросе функция malloc() выделяет требуемый участок свободной памяти, a free() освобождает его, то есть возвращает системе. В программу, использующую эти функции, должен быть включен заголовочный файл <stdlib.h>.

Указатели используются для динамического выделения памяти компьютера для хранения данных. Динамическое распределение означает, что программа выделяет память для данных во время своего выполнения. Память для глобальных переменных выделяется во время компиляции, а для нестатических локальных переменных — в стеке. Память, выделяемая в С функциями динамического распределения данных, находится в т.н. динамически распределяемой области памяти (heap). Динамически распределяемая область памяти — это свободная область памяти, не используемая программой, операционной системой или другими программами. Размер динамически распределяемой области памяти заранее неизвестен, но как правило в ней достаточно памяти для размещения данных программы.

1. Прототип функции malloc() следующий:

void *malloc(size_t количество_байтов);

Здесь количество_байтов — размер памяти, необходимой для размещения данных. (Тип size_t определен в <stdlib.h> как некоторый целый без знака.) Функция malloc() возвращает указатель типа void *, поэтому его можно присвоить указателю любого типа. При успешном выполнении malloc() возвращает указатель на первый байт непрерывного участка памяти, выделенного в динамически распределяемой области памяти. Если в динамически распределяемой области памяти недостаточно свободной памяти для выполнения запроса, то память не выделяется и malloc() возвращает нуль.

Пример:

#include<stdio.h>

#include<string.h>

#include<alloc.h>

#include<process.h>

int main(void)

{

   char *str;

   /* выделить память под строку */

   if((str = malloc(10)) == NULL)

   {

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

      exit(1); /* завершение с кодом ошибки */

   }

   /* скопировать в строку "Hello" */

   strcpy(str,"Hello");

   /* вывести строку */

   printf("Строка: %s\n",str);

   /* освободить память */

   free(str);

   return 0;

}

2 Функция free() имеет следующий прототип:

void free(void *p)

Здесь р — указатель на участок памяти, выделенный перед этим функцией malloc(). Функцию free() ни в коем случае нельзя вызывать с неправильным аргументом, это мгновенно разрушит всю систему распределения памяти.

Подсистема динамического распределения в С используется совместно с указателями для создания различных программных конструкций, таких как связные списки и двоичные деревья.

Пример:

#include<string.h>

#include<stdio.h>

#include<alloc.h>

int main(void)

{

   char *str;

   /* выделить память под строку */

   str = malloc(10);

   /* скопировать в строку "Hello" */

   strcpy(str,"Hello");

   /* вывести строку */

   printf("Строка: %s\n",str);

   /* освободить память */

   free(str);

   return 0;

3. Функция    calloc выделяет оперативную память.

Синтаксис          #include <stdlib.h

                   void * calloc(size_t nitems, size_t size);

Файл, содержащий   stdlib.h,alloc.

calloc обеспечваеит доступ к динамической области памяти. Динамическая  область  памяти  доступна для динамического    распределения    блоков     памяти переменной    длины.   Многие   структуры   данных, например,    деревья    и    списки,     используют распределение динамической области памяти. calloc выделяет блок памяти размером nitems x size. Блок обнуляется.Если  вы  хотите  выделить  блок, размер которого превышает 64К то нужно использовать функцию farcalloc.

Пример:

#include<stdio.h>

#include<alloc.h>

#include<string.h>

int main(void)

{

   char *str = NULL;

   /* выделить память для строки */

   str = calloc(10,sizeof(char));

   if(str)

   {

      /* скопировать в строку "Hello" */

      strcopy(str,"Hello");

      /* вывести строку */

      printf("Строка : %s\n",str);

      /* освободить память */

      free(str);

   }

   else

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

   }

   return(0);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]