При программировании мы можем столкнуться с ситуацией, когда количество элементов данных продолжает изменяться во время выполнения программы. Например, мы создали программу, которая хранит данные о сотрудниках компании. Список сотрудников постоянно меняется с приходом новых сотрудников или уходом старых сотрудников из компании. Когда этот список увеличивается, нам нужно больше памяти для хранения информации о новых сотрудниках. Точно так же, когда кто-то из сотрудников уходит, нам нужно освободить память, чтобы ее можно было использовать для хранения другой информации. Такое условие может эффективно управляться с помощью концепции динамического распределения памяти.
Выход
Динамическое распределение памяти в C
Процесс выделения памяти во время выполнения известен как динамическое выделение памяти. В Си это делается с использованием четырех функций управления памятью, которые приведены ниже. В этом уроке мы обсудим их один за другим в деталях.
1. malloc ()
2. calloc ()
3. free ()
4. realloc ()
2. calloc ()
3. free ()
4. realloc ()
Примечание: файл заголовка, используемый для этих четырех функций, является stdlib.h.
На изображении ниже вы можете видеть, что между локальными переменными и областью глобальных переменных есть свободное пространство. Это свободное пространство называется кучей и используется для динамического выделения памяти.
Программа хранения C - источник изображения |
malloc () в C
Блок памяти может быть выделен с помощью функции malloc (). Каждый выделенный байт содержит значение мусора. Проверьте его синтаксис ниже.
Синтаксис
pointer_name = (caste_type *) malloc (size_in_bytes);
pointer_name = (caste_type *) malloc (size_in_bytes);
Пример
p = (int *) malloc (100 * sizeof (int));
p = (int *) malloc (100 * sizeof (int));
Вышеуказанный оператор выделит пространство памяти в 100 раз больше размера типа данных int. Это означает, что если целое число занимает 2 байта, то будет выделено 200 байтов. Здесь sizeof () - это оператор, который даст размер типа данных int. Функция malloc () вернет адрес первого байта выделенной памяти, и этот адрес будет сохранен в указателе p.
Давайте возьмем еще один пример.
p = (char *) malloc (10);
Это выделит 10 байтов памяти, в которой могут храниться только значения типов символов.
malloc () выделяет блок смежных байтов. Если он не может найти пространство указанного размера в куче, он вернет NULL. Рекомендуется проверить переменную указателя, чтобы убедиться, что выделение памяти прошло успешно.
calloc () в C
Он используется для выделения нескольких блоков памяти одинакового размера. Каждый байт автоматически обнуляется. Эта функция обычно используется для выделения памяти для производных типов данных, таких как массивы и структуры.
Синтаксис
pointer_name = (cast_type *) calloc (n, size_in-bytes);
pointer_name = (cast_type *) calloc (n, size_in-bytes);
пример
1
2
3
4
5
6
7
8
9
|
. . . . .
struct student
{
char name[20];
int roll_no;
}*p;
p = (struct student*) calloc(5, sizeof(struct student) );
. . . . .
|
Это позволит выделить 5 блоков памяти одинакового размера, которые могут хранить пять записей структуры ученика. Если calloc () не может найти указанное пространство памяти, он вернет NULL.
бесплатно () в C
Когда мы распределяем память динамически, мы несем ответственность за освобождение памяти, когда она больше не используется, чтобы ее можно было использовать для хранения некоторой другой информации. В Си это можно сделать с помощью функции free ().
Синтаксис
свободный (указатель_имя);
свободный (указатель_имя);
Пример
свободный (р);
свободный (р);
Здесь p - переменная указателя, которая содержит адрес первого байта блока памяти, выделенного функцией malloc () или calloc ().
realloc () в C
Для динамического изменения размера памяти мы используем функцию realloc (). Мы можем столкнуться с условием, что ранее выделенной памяти недостаточно для хранения данных и требуется больше места. Или мы выделили пространство памяти больше, чем нужно. В этих случаях мы можем легко изменить размер выделенной памяти, используя realloc ().
Синтаксис
указатель_имя = realloc (указатель_имя, новый_размер);
указатель_имя = realloc (указатель_имя, новый_размер);
Пример
p = malloc (10);
p = realloc (p, 20);
p = malloc (10);
p = realloc (p, 20);
realloc () выделяет новый блок памяти и копирует данные, присутствующие в предыдущем выделенном блоке, в новый блок. Ранее выделенный блок памяти автоматически освобождается. Он также возвращает NULL, если не удается найти указанное пространство памяти в куче.
Давайте сделаем одну программу, чтобы понять использование всех этих функций управления памятью в C.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#include<stdio.h>
#include<stdlib.h>
void main()
{
int *p,i;
p=(int*)malloc(3*sizeof(int));
//checking the memory allocation was successful
if(p==NULL)
{
printf("nInsufficient memory");
exit(0);
}
printf("Enter three numbers:");
for(i=0;i<3;++i)
scanf("%d",p+i);
for(i=0;i<3;++i)
printf("%d ",*(p+i));
//altering the memory
p=realloc(p,5*sizeof(int));
//checking the memory allocation was successful
if(p==NULL)
{
printf("nInsufficient memory");
exit(0);
}
printf("nnEnter two more numbers:");
scanf("%d%d",p+3,p+4);
for(i=0;i<5;++i)
printf("%d ",*(p+i));
//free the memory
free(p);
}
|
Выход
Объяснение
1. В приведенной выше программе я сначала выделяю пространство памяти для хранения трех целочисленных значений с помощью функции malloc (). Вы можете ясно видеть, что я проверяю указатель p перед использованием, чтобы убедиться, что выделение памяти прошло успешно.
1. В приведенной выше программе я сначала выделяю пространство памяти для хранения трех целочисленных значений с помощью функции malloc (). Вы можете ясно видеть, что я проверяю указатель p перед использованием, чтобы убедиться, что выделение памяти прошло успешно.
2. После этого я взял три целочисленных значения, а затем сохранил их в памяти и отобразил их.
3. Теперь я изменяю объем памяти, который я выделил ранее. Я изменяю объем памяти с помощью функции realloc (), чтобы я мог сохранить еще два целых значения.
4. После прочтения еще двух значений я снова отображаю все значения. Вы можете видеть, что три значения, которые я сохранил ранее, остаются без изменений.
5. Наконец я освободил память, используя функцию free ().
Так что это все о динамическом распределении памяти в C. Если вы обнаружите, что что-то отсутствует или неверно в предыдущем уроке, пожалуйста, сообщите мне Не стесняйтесь спрашивать, если у вас есть какие-либо сомнения относительно вышеупомянутого учебника.
Комментариев нет:
Отправить комментарий