В този урок ще се научите да разпределяте динамично паметта във вашата програма C, използвайки стандартни библиотечни функции: malloc (), calloc (), free () и realloc ().
Както знаете, масивът е колекция от фиксиран брой стойности. След като декларирате размера на масив, не можете да го променяте.
Понякога размерът на декларирания от вас масив може да е недостатъчен. За да разрешите този проблем, можете да разпределите паметта ръчно по време на изпълнение. Това е известно като динамично разпределение на паметта в програмирането на C.
За да се разпредели памет динамично, библиотечни функции са malloc()
, calloc()
, realloc()
и free()
се използват. Тези функции са дефинирани в заглавния файл.
C malloc ()
Името "malloc" означава разпределение на паметта.
Най malloc()
функцията си запазва блок от паметта на определен брой байтове. И връща указател, void
който може да бъде хвърлен в указатели от всякаква форма.
Синтаксис на malloc ()
ptr = (castType*) malloc(size);
Пример
ptr = (float*) malloc(100 * sizeof(float));
Горният оператор разпределя 400 байта памет. Защото размерът на float
е 4 байта. И указателят ptr съдържа адреса на първия байт в разпределената памет.
Изразът води до NULL
указател, ако паметта не може да бъде разпределена.
C calloc ()
Името "calloc" означава непрекъснато разпределение.
Най malloc()
функцията памет Разпределя и листа паметта неподготвена. Докато calloc()
функцията разпределя паметта и инициализира всички битове до нула.
Синтаксис на calloc ()
ptr = (castType*)calloc(n, size);
Пример:
ptr = (float*) calloc(25, sizeof(float));
Горното изявление разпределя непрекъснато място в паметта за 25 елемента от тип float
.
C безплатно ()
Динамично разпределена памет, създадена с или calloc()
или malloc()
не се освобождава сама. Трябва да използвате изрично, за free()
да освободите пространството.
Синтаксис на free ()
free(ptr);
Това изявление освобождава мястото, разпределено в паметта, посочена от ptr
.
Пример 1: malloc () и free ()
// Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) malloc(n * sizeof(int)); // if memory cannot be allocated if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); // deallocating the memory free(ptr); return 0; )
Тук динамично сме разпределили паметта за n броя на int
.
Пример 2: calloc () и free ()
// Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) calloc(n, sizeof(int)); if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); free(ptr); return 0; )
C realloc ()
Ако динамично разпределената памет е недостатъчна или повече от необходимата, можете да промените размера на предварително разпределената памет, като използвате realloc()
функцията.
Синтаксис на realloc ()
ptr = realloc(ptr, x);
Тук ptr се преразпределя с нов размер x.
Пример 3: realloc ()
#include #include int main() ( int *ptr, i , n1, n2; printf("Enter size: "); scanf("%d", &n1); ptr = (int*) malloc(n1 * sizeof(int)); printf("Addresses of previously allocated memory: "); for(i = 0; i < n1; ++i) printf("%u",ptr + i); printf("Enter the new size: "); scanf("%d", &n2); // rellocating the memory ptr = realloc(ptr, n2 * sizeof(int)); printf("Addresses of newly allocated memory: "); for(i = 0; i < n2; ++i) printf("%u", ptr + i); free(ptr); return 0; )
Когато стартирате програмата, изходът ще бъде:
Въведете размер: 2 Адреси на предварително разпределена памет: 26855472 26855476 Въведете новия размер: 4 Адреси на новоразпределена памет: 26855472 26855476 26855480 26855484