Пре него што научите доделу динамичке меморије Ц, схватимо:
Како функционише управљање меморијом у Ц-у?
Када декларишете променљиву користећи основни тип података, Ц компајлер аутоматски додељује меморијски простор за променљиву у скупу меморије који се назива стек .
На пример, променљива флоат узима обично 4 бајта (према платформи) када је декларисана. Ове податке можемо проверити помоћу оператора сизеоф као што је приказано у доњем примеру
#includeint main() { float x; printf("The size of float is %d bytes", sizeof(x)); return 0;}
Излаз ће бити:
The size of float is 4 bytes
Такође, низ са назначеном величином додељује се у суседне блокове меморије, сваки блок има величину за један елемент:
#includeint main() { float arr[10];printf("The size of the float array with 10 element is %d", sizeof(arr)); return 0;}
Резултат је:
The size of the float array with 10 element is 40
Као што смо до сада научили, приликом декларисања основног типа података или низа, меморијом се аутоматски управља. Међутим, постоји поступак за доделу меморије на језику Ц који ће вам омогућити да примените програм у коме величина низа није одлучена док не покренете свој програм (време извршавања). Овај процес се назива „ Динамичко додељивање меморије “.
У овом упутству ћете научити-
- Како функционише управљање меморијом у Ц-у?
- Динамичко додељивање меморије у Ц.
- Функција Ц маллоц ()
- Функција фрее ()
- Ц цаллоц () функција
- цаллоц () насупрот маллоц (): Кључне разлике
- Функција Ц реаллоц ()
- Динамички низови
Динамичко додељивање меморије у Ц.
Динамичко додељивање меморије је ручно додељивање и ослобађање меморије у складу са вашим програмским потребама. Динамичком меморијом се управља и сервира се помоћу показивача који упућују на ново додељени меморијски простор у подручју које називамо гомила.
Сада можете без проблема динамички да креирате и уништите низ елемената током извођења. Да резимирамо, аутоматско управљање меморијом користи стек, а Ц Динамиц Мемори Аллоцатион користи гомилу.
Библиотека <стдлиб.х> има функције одговорне за динамичко управљање меморијом.
Функција | Сврха |
маллоц () | Додељује меморију тражене величине и враћа показивач на први бајт додељеног простора. |
цаллоц () | Додељује простор за елементе низа. Иницијализује елементе на нулу и враћа показивач у меморију. |
реаллоц () | Користи се за модификовање величине претходно додељеног меморијског простора. |
Бесплатно() | Ослобађа или празни претходно додељени меморијски простор. |
Размотримо горње функције са њиховом применом
Функција Ц маллоц ()
Функција Ц маллоц () означава додељивање меморије. То је функција која се користи за динамичко додељивање блока меморије. Резервира меморијски простор одређене величине и враћа нулти показивач који показује на меморијску локацију. Враћени показивач обично је типа воид. То значи да било којем показивачу можемо доделити функцију Ц маллоц ().
Синтакса функције маллоц ():
ptr = (cast_type *) malloc (byte_size);
Ево,
- птр је показивач на цаст_типе.
- Функција Ц маллоц () враћа показивач на додељену меморију бите_сизе.
Пример маллоц ():
Example: ptr = (int *) malloc (50)
Када се ова изјава успешно изврши, резервисан је меморијски простор од 50 бајтова. Адреса првог бајта резервисаног простора додељује се показивачу птр типа инт.
Размотримо још један пример:
#includeint main(){int *ptr;ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */if (ptr != NULL) {*(ptr + 5) = 480; /* assign 480 to sixth integer */printf("Value of the 6th integer is %d",*(ptr + 5));}}
Излаз:
Value of the 6th integer is 480
- Приметите да је сизеоф (* птр) коришћен уместо сизеоф (инт) да би се код учинио робуснијим када се * птр декларација касније укуца у други тип података.
- Додјела може пропасти ако меморија није довољна. У овом случају враћа НУЛЛ показивач. Дакле, требали бисте укључити код за провјеру НУЛЛ показивача.
- Имајте на уму да је додељена меморија суседна и може се третирати као низ. Можемо користити аритметику показивача за приступ елементима низа уместо да користимо заграде []. Саветујемо да користите + за позивање на елементе низа, јер употреба повећања ++ или + = мења адресу коју чува показивач.
Функција Маллоц () се такође може користити са типом података о знаковима, као и са сложеним типовима података као што су структуре.
Функција фрее ()
Меморија за променљиве се аутоматски ослобађа у време компајлирања. У динамичком додељивању меморије, морате експлицитно ослободити меморију. Ако се то не уради, можете наићи на грешку без меморије.
Функција фрее () позива се за ослобађање / ослобађање меморије у Ц. Ослобађањем меморије у програму, учините више доступним за касније коришћење.
На пример:
#includeint main() {int* ptr = malloc(10 * sizeof(*ptr));if (ptr != NULL){*(ptr + 2) = 50;printf("Value of the 2nd integer is %d",*(ptr + 2));}free(ptr);}
Оутпут
Value of the 2nd integer is 50
Ц цаллоц () функција
Функција Ц цаллоц () означава суседну алокацију. Ова функција се користи за додељивање више блокова меморије. То је функција динамичког додељивања меморије која се користи за додељивање меморије сложеним структурама података као што су низови и структуре.
Функција Маллоц () користи се за додељивање једног блока меморијског простора, док се цаллоц () у Ц користи за додељивање више блокова меморијског простора. Сваки блок додељен функцијом цаллоц () је исте величине.
Синтакса функције цаллоц ():
ptr = (cast_type *) calloc (n, size);
- Горња изјава се користи за додељивање н меморијских блокова исте величине.
- Након додељивања меморијског простора, сви бајтови се иницијализују на нулу.
- Враћен је показивач који је тренутно у првом бајту додељеног меморијског простора.
Кад год дође до грешке при додељивању меморијског простора као што је недостатак меморије, враћа се нулти показивач.
Пример калока ():
Програм у наставку израчунава збир аритметичког низа.
#includeint main() {int i, * ptr, sum = 0;ptr = calloc(10, sizeof(int));if (ptr == NULL) {printf("Error! memory not allocated.");exit(0);}printf("Building and calculating the sequence sum of the first 10 terms \ n ");for (i = 0; i < 10; ++i) { * (ptr + i) = i;sum += * (ptr + i);}printf("Sum = %d", sum);free(ptr);return 0;}
Резултат:
Building and calculating the sequence sum of the first 10 termsSum = 45
цаллоц () насупрот маллоц (): Кључне разлике
Следи кључна разлика између маллоц () Вс цаллоц () у Ц:
Функција цаллоц () је генерално погоднија и ефикаснија од функције маллоц (). Иако се обе функције користе за додељивање меморијског простора, цаллоц () може истовремено доделити више блокова. Не морате сваки пут да захтевате меморијски блок. Функција цаллоц () користи се у сложеним структурама података којима је потребан већи меморијски простор.
Меморијски блок који је додијелио цаллоц () у Ц увијек је иницијализиран на нулу док у функцији маллоц () у Ц увијек садржи вриједност смећа.
Функција Ц реаллоц ()
Помоћу функције Ц реаллоц () можете додати већу величину меморије већ додељеној меморији. Проширује тренутни блок, а оригинални садржај оставља такав какав јесте. реаллоц () у Ц означава прерасподелу меморије.
реаллоц () се такође може користити за смањење величине претходно додељене меморије.
Синтакса функције реаллоц ():
ptr = realloc (ptr,newsize);
Горња изјава додељује нови меморијски простор са назначеном величином у променљивој невсизе. Након извршавања функције, показивач ће се вратити на први бајт меморијског блока. Нова величина може бити већа или мања од претходне меморије. Не можемо бити сигурни да ли ће ново додељени блок указивати на исто место као и претходни меморијски блок. Ова функција ће копирати све претходне податке у новом региону. Осигурава да подаци буду сигурни.
Пример реаллоц ():
#includeint main () {char *ptr;ptr = (char *) malloc(10);strcpy(ptr, "Programming");printf(" %s, Address = %u\n", ptr, ptr);ptr = (char *) realloc(ptr, 20); //ptr is reallocated with new sizestrcat(ptr, " In 'C'");printf(" %s, Address = %u\n", ptr, ptr);free(ptr);return 0;}
Кад год реаллоц () у Ц резултира неуспешном операцијом, враћа нулл показивач и ослобађају се и претходни подаци.
Динамички низови у Ц.
Динамички низ у Ц омогућава да број елемената расте по потреби. Ц Динамички низ се широко користи у алгоритмима рачунарства.
У следећем програму смо креирали и променили величину динамичког низа у језику Ц.
#includeint main() {int * arr_dynamic = NULL;int elements = 2, i;arr_dynamic = calloc(elements, sizeof(int)); //Array with 2 integer blocksfor (i = 0; i < elements; i++) arr_dynamic[i] = i;for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]);elements = 4;arr_dynamic = realloc(arr_dynamic, elements * sizeof(int)); //reallocate 4 elementsprintf("After realloc\n");for (i = 2; i < elements; i++) arr_dynamic[i] = i;for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]);free(arr_dynamic);}
Резултат програма Ц Динамиц арраи на екрану:
arr_dynamic[0]=0arr_dynamic[1]=1After reallocarr_dynamic[0]=0arr_dynamic[1]=1arr_dynamic[2]=2arr_dynamic[3]=3
Резиме
- Можемо динамички управљати меморијом стварањем меморијских блокова по потреби у гомили
- У Ц динамичком додељивању меморије, меморија се додељује у току времена.
- Динамичко додељивање меморије дозвољава манипулацију низовима и низовима чија је величина флексибилна и може се променити било када у вашем програму.
- Потребно је када немате појма колико ће меморије заузети одређена структура.
- Маллоц () у језику Ц је функција динамичке алокације меморије која означава алокацију меморије која блокира меморију одређене величине иницијализовану за вредност смећа
- Цаллоц () на Ц је суседна функција алокације меморије која додељује више меморијских блокова истовремено иницијализованих на 0
- Реаллоц () у језику Ц користи се за прерасподјелу меморије према наведеној величини.
- Функција Фрее () користи се за брисање динамички додељене меморије.