Malloc

From Wikipedia, the free encyclopedia

Remove ads

(од енгл. ) је функција која у програмском језику служи за динамичку алокацију меморије. При позиву сваке функције, на стеку се алоцира неопходна меморија за све променљиве које се користе у тој функцији. Међутим, да би се ова меморија алоцирала на стеку, неопходно је да се унапред (у време компилације) зна које се све променљиве користе, и колико меморије (бајтова) оне захтевају. Проблем се јавља уколико се у време компилације не зна колико меморије је потребно. На пример, уколико се у функцији користи низ чија дужина зависи од улаза који прослеђује корисник програма. У таквим случајевима се прибегава динамичкој алокацији меморије помоћу функције , или неке од њој сродних функција. Меморија коју алоцира се не налази на стеку, већ у хипу.

Функција се налази у стандардној библиотеци, која се укључује наредбом

#include <stdlib.h>
Remove ads

Употреба

Функцији се прослеђује један целобројни аргумент, који означава количину бајтова које је потребно алоцирати.

malloc(brojBajtova); /* алоцира brojBajtova бајтова, и враћа показивач на алоцирану меморију */

враћа показивач на почетак дела меморије одговарајуће величине или уколико је дошло до грешке и меморија није алоцирана. Показивач који враћа је типа , тако да је неопходно кастовати га у показивач одговарајућег типа да би радила показивачка аритметика.

(tipPodataka*)malloc(brojBajtova); /* алоцира brojBajtova бајтова и враћа показивач типа tipPodataka */

Међутим, ни ово није практично, јер бисмо морали да знамо тачан број бајтова који је потребан за тип или структуру података коју користимо. Један тип податка на различитим архитектурама рачунара може да заузима више или мање бајтова, тако да се у пракси никада не наводи експлицитно колико бајтова је неопходно, већ се користи функција , која као аргумент узима тип података, а враћа његову величину у бајтовима. Ова функција се позива у оквиру позива функције , за одговарајући тип података, а затим се вредност коју она враћа множи одговарајућим бројем. На пример, уколико нам је потребан целобројан низ дужине , позив функцији би изгледао овако:

(int*)malloc(sizeof(int)*n)/* алоцира неопходан број бајтова за смештање n int-ова и враћа показивач типа int */
Remove ads

Ослобађање меморије

Ако алоцирана меморија у једном тренутку престане да се користи, неопходно је да се она ослободи. Ослобађање меморије се врши позивом функције , којој се као аргумент прослеђује показивач на меморију која се ослобаћа.

free(pokazivacNaMemoriju);

Уколико се меморија не ослободи, а на њу више не показује ниједна променљива, она је за програм изгубљена. Ово се назива цурењем меморије. Допуштање цурења меморије се сматра лошом програмерском праксом, јер уколико програм дуже времена ради, а изнова и изнова алоцира меморију коју након употребе не ослобађа, програм ће без потребе користити све више и више меморијских ресурса.

Remove ads

Сродне функције

Ваља знати да само проналази слободан блок меморије одговарајућве величине, и враћа показивач на њега. Није познато шта се у том блоку меморије налази (ту се налазе подаци који су раније били уписани у тај сегмент меморије), па се не смеју правити било какве претпоставке о садржају те меморије. У случају потребе, уместо функције , могуће је позвати њој сродну функцију , која ради на исти начин као и сем што алоцирани блок меморије испуњава нулама.

Уколико се испостави да алоцирани блок меморије није довољно велики (рецимо, потребно је проширити низ), доступна је функција , којој се прослеђује показивач на блок меморије који је потребно проширити и захтевана нова величина блока. Ова функција проналази на хипу нови блок меморије одговарајуће величине, и у њега преписује садржај старог, мањег блока.

Види још

  • сакупљач ђубрета

Спољашње везе

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads