Динамички подаци

Наредбама за дефинисање података које смо до сада користили врши се статичка додела меморијског простора. То подразумева да се у време превођења програма зна тачан број података који ће бити коришћени у току извршавања програма.

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

Део меморије у који се смештају статички дефинисани подаци назива се статичка зона меморије.

Језик C омогућава да се за потребе смештања података, чији се број и/или величина не зна у време писања и превођења програма, тражи од оперативног система рачунара простор у меморији у време извршавања програма. Део меморије у којем се врши динамичка додела простора у време извршавања програма, назива се динамичка зона меморије. Подаци у динамичкој зони меморије називају се динамички подаци.

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

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

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

Динамичка додела меморије

Управљање меморијом у динамичкој зони остварује се помоћу библиотечких функција чији се прототипови налазе у стандардном заглављу . Постоје следеће библиотечке функције за динамичко додељивање меморије:

void *malloc(int vel);

Функција malloc додељује меморију од vel бајтова. Вредност функције је показивач на додељени простор, или NULL ако захтев не може да буде задовољен. Садржај додељеног простора је недефинисан

void *calloc (int n, int vel);

Функција calloc додељује меморију за низ од n елемената од којих сваки има по vel бајтова. Вредност функције је показивач на додељени простор, или NULL ако захтев не може да буде задовољен. Додељени простор попуњава се нулама

void *realloc (void *p, int vel);

Функција realloc мења величину додељене меморије на коју показује показивач p u vel бајтова. Показивач p мора да садржи вредност која је раније добијена као вредност неке од функција malloc, calloc или realloc. Нова величина може да буде већа или мања од старе. У случају смањивања величине додељене меморије, скраћивање се врши од краја, а садржај задржаних бајтова се сачува. У случају повећања додељене меморије нови бајтови, недефинисаног садржаја, додају се на крају. Вредност функције је показивач на ново место додељене меморије, или NULL ако захтев не може да буде задовољен. У случају неуспеха сачува се почетно место и садржај додељене меморије.

void free (void *p);

Функција free ослобађа простор на који показује показивач p. Показивач p мора да садржи вредност која је раније добијена као вредност неке од функција malloc, calloc или realloc. Важно је да се простор додељен динамичким подацима који више нису потребни ослободи да би по потреби могао да буде додељен другим динамичким подацима у току истог програма.

Пример: динамичка додела меморије простом податку

long double *p; /* definisanje pokazivaca */
p=malloc(sizeof(double)); /* dodela memorije podatku tipa double */
*p=5.2; /* dodela vrednosti dinamickom podatku */
printf(“%f”, *p);
free (p); /* oslobadjanje memorijskog prostora */

Приликом додељивања меморије динамичким подацима потребну величину меморије УВЕК треба исказати помоћу оператора sizeof.

Последњом наредбом, када динамички податак више није потребан ослобажа се раније додељени простор. Скреће се пажња да се вредност показивача тиме не мења, али оно на шта он показује више није додељено посматраном програму, тако да се том простору више НЕ СМЕ приступати помоћу показивача p!

Пример 1:

#include <stdio.h>
#include <stdlib.h>
int main(){
/* p je pokazivac na int, koji trenutno ne pokazuje ni na sta. Stoga ga inicijalizujemo na NULL */
int *p = NULL;
/* dinamicki alociramo prostor za jedan ceo broj*/
p = (int *) malloc(sizeof(int));
/* Nakon alociranja prostora obavezno se mora proveriti da li je uspela alokacija! Ako je malloc vratila vrednost NULL, to nam je indikator neuspesne alokacije. */
if( p == NULL){printf("malloc() greska!\n");exit(1);}
printf("Unesite ceo broj: ");
/* Ucitavamo ceo broj i smestamo ga u dinamicki rezervisan prostor. */
scanf("%d", p);
/* Ispisujemo podatak na standardni izlaz. */
printf("Uneli ste %d.\n", *p);
/* Oslobadjamo dinamicki alociran prostor. */
free(p);
return 0;
}
Advertisements

Оставите одговор

Попуните детаље испод или притисните на иконицу да бисте се пријавили:

WordPress.com лого

Коментаришет користећи свој WordPress.com налог. Одјавите се /  Промени )

Google+ photo

Коментаришет користећи свој Google+ налог. Одјавите се /  Промени )

Слика на Твитеру

Коментаришет користећи свој Twitter налог. Одјавите се /  Промени )

Фејсбукова фотографија

Коментаришет користећи свој Facebook налог. Одјавите се /  Промени )

w

Повезивање са %s