26 – DARS. DINAMIK HOTIRA.
Dinamik hotira bu dastur bajarilishi jarayonida ajratiladigan hotiradir. Dinamik hotira ajratilgandan so’ng to free() funktsiyasi tomonidan bo’shatilmaguncha saqlanadi.
Agar dinamik hotira dastur bajarilishi tugaguncha bo’shatilmagan bo’lsa, avtomatik ravishda dastur tugaganda bo’shatiladi. Shunga qaramay ajratilgan hotirani dasturda mahsus bo’shatish dasturlashning sifatini oshiradi.
Dastur bajarilish davomida ajratilgan hotira qismiga murojaat imkoniyati shu qismga adreslovchi ko’rsatkichga bog’likdir. Shunday qilib, biror blokda ajratilayotgan dinamik hotira bilan ishlashning quyidagi uchta varianti mavjuddir:
• Ko’rsatkich avtomatik hotira turiga kiruvchi lokal ob'ekt. Bu holda ajratildgan hotiraga blokdan tashqarida murojaat qilib bo’lmaydi, shuning uchun blokdan chiqishda bu hotirani bo’shatish lozimdir.
• Ko’rsatkich avtomatik hotira turiga kiruvchi lokal statitk ob'ekt. Blokda bir marta ajratilgan dinamik hotiraga, blokka har bir qayta kirilganda ko’rsatkich orqali murojaat qilish mumkindir. Hotirani blokdan foydalanib bo’lgandan so’ng bo’shatish lozimdir.
• Ko’rsatkich blokka nisbatan global ob'ektdir. Dinamik hotiraga ko’rsatkich ko’rinuvchi hamma bloklardan murojaat qilish mumkin.Hotirani fakat undan foydalanib bo’lgandan so’ng b’oshatish lozimdir.
Ikkinchi variantga misol keltiramiz, bu misolda dinamik hotira ob'ekti ichki statik k’orsatkich bilan bog’likdir:
Include
Include
Void dynamo(void)
{
static char *uc=NULL;
if (uc==NULL)
{
uc=(char*)malloc(1);
*uc=’A’;
}
printf(“\t%c”,*uc);
(*uc)++;
return;
};
void main()
{
int I;
for (i=0;i<5;i++)
dynamo();
};
Dastur bajarilishi natijasi:
A B C D E
Bu dasturning kamchiligi ajratilgan hotira free() funktsiyasi yordamida bo’shatilmasligidir. Keyingi dasturda dinamik hotiraga ko’rsatkich global ob'ektdir:
Include
Include
char *uk=NULL;
void dynam1(void)
{
printf(“\t%c”,*uc);
(*uk)++;
return;
};
void main()
{
int I;
uk=(char*)malloc(1);
*uk=’A’;
for (i=0;i<5;i++)
{
dynam1();
(*uk)++;
}
free(uk);
};
Dastur bajarilishi natijasi:
A C E G I
Dinamik ob'ekt asosiy dasturda yaratilib, u ko’rsatkich bilan bog’likdir. Dasturda boshlang’ich ‘A’ qiymatga ega bo’ladi. Ko’rsatkich global bo’lgani uchun dinamik ob'ektga main() va dynamic() funktsiyalarida murojaat qilish mumkin. Dinamik hotiraga ajratilgandan so’ng shu ob'ekt bilan bog’lik ko’rsatkich tashqi ob'ekt sifatida ta'riflangan ihtiyoriy blokda murojaat qilish mumkin.
Do'stlaringiz bilan baham: |