Malloc

Из Википедије, слободне енциклопедије

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

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

#include <stdlib.h>

Употреба[уреди]

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

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

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

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

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

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

Ослобађање меморије[уреди]

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

free(pokazivacNaMemoriju);

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

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

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

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

Види још[уреди]

Спољашње везе[уреди]