Динамикалық жады – бұл программаның орындалу барысында бөлінетін жады. Ал мына сұраққа: "Динамикалық жадыда глобальды ма әлде локальді объект орналасқан?" дұрыс жауап тауып көрейік.
Динамикалық жадыны бөлгеннен кейін, арнайы библиотекалық free() функциясының көмегімен ғана орындалуы мүмкін, оның толық босатылуына дейін сақталады. Егер динамикалық жады программаның память не была освобождена до окончания выполнения программы, то она освобождается автоматически при завершении программы. Тем не менее, явное освобождение ставшей ненужной памяти является признаком хорошего стиля программирования.
Программаның орындалу барысында динамикалық жады аумағы осы аумақты адрестейтін нұсқаушы рұқсат етілген барлық жерде рұқсат етілген. Сондай қандай да бір блокта бөлінген (мысалы, негізгі емес функцияның денесінде) динамикалық жадымен жұмыстың келесі үш нұсқасы мүмкін:
нұсқаушы (динамикалық жады аумағында) автоматты жадының локальды объектісі ретінде анықталған. Бұл жағдайда бөлініп алынған жады нұсқаушының локальденуі блогының сыртына шыға бергенде рұқсат жоқ болады, және оны блоктан шығар алдында босату қажет;
нұсқаушы статистикалық жадының локальды объектісі ретінде анықталған. Блокта бөлініп алынған динамикалық жады әр блокқа кірген сайын нұсқаушы арқылы рұқсат етілген. Жадыны тек оны қолдануды аяқтағаннан кейін ғана босату керек;
нұсқаушы блокқа байланысты глобальді объект болып табылады. Динамикалық жады нұсқаушы "көрінген" барлық блокта мүмкін. Жадыны тек оны қолдануды аяқтағаннан кейін босату керек.
Динамикалық жадының объектісі ішкі статистикалық нұсқаушымен(локальденген) байланысты болғанда, екінші нұсқасын иллюстрациялаймыз:
#include #include /* malloc(),free() функциялары үшін */
void dynam(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++)
dynam( );
}
Программа орындалуының нәтижесі: А B C D E
Алдыңғы программаның дұрыс еместігі - malloc()функциясымен бөлінген жады аумағы free( ) функциясымен босатылуы екіталай.
Келесі программада нұсқаушы жадының динамикалық аумағында - глобальды объект:
#include #include /* malloc( ), free( ) функциялары үшін */
char * uk=NULL; /* глобальды нұсқаушы */
void dynam1 (void)
{
printf("\t%c", *uk) ;
(*uk)++;
}
void main (void)
{
int i ;
uk=(char*) malloc (1);
*uk='A' ;
for (i=0; i<5; i++)
{
dynam1();
(*uk)++;
}
free(uk);
}
Программа орындалуының нәтижесі: А С Е G I
Динамикалық объект негізгі функцияда құрылады және uk нұсқаушысымен байланысады. Сол жерде меншіктеуде бастапқы 'А' мәнін қабылдайды. Динамикалық объект глобальды нұсқаушы есебінен екі main() және dynam1() функцияларында да мүмкін. main() және dynam1() функциясының ішінде циклдың орындалу барысында динамикалық объект мәні өзгереді.
Жадының динамикалық бөлінген аумағын адрестейтін нұсқаушы, автоматты жады объектісі болып табылатындығына мысал келтірудің қажеттігі жоқ. Атап өтейік, динамикалық жады, анықталған немесе сыртқы объект ретінде сипатталған нұсқаушының осы жадымен байланысқан жерінде(кез-келген функцияда және кез-келген файлда) бөлінгеннен кейін барлық жерде рұқсат етілген. Ішкі объект анықтамасын нақты анықтау керек, ол тақырыпқа да көшеміз.