C Динамично разпределение на паметта, използвайки malloc (), calloc (), free () & realloc ()

В този урок ще се научите да разпределяте динамично паметта във вашата програма 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

Интересни статии...