Dinamik Bellek Erişimi Flashcards
Nedir
include<cstdlib> kütüphanesinde;</cstdlib>
Bir tanım yaptıkan sonra program boyunca bize bir yer ayrılıyor ve program boyunca bu yer kalıyor ve bize bu yeri silmiyor. Bunu compiler yapıyor(yer ayırma işlemi)
Ancak biz bunu runtime da kendimiz yapmak istersek çeşitli standart fonksiyonlarımız var
malloc
calloc
realloc
free
fonksiyonlAI İLE hafıza bloğunda runtimeda spesifik yer ayırabiliriz.
Fonksiyonlar
malloc
calloc ve realloc ile hafızayda yer ayırdıysak
free fonksiyonu ile geri verebiliriz.
Hafıza blokları
- // Kullanılmayan yerler
** ** // Runtime da heap alanı(dinamik olarak kullanılabilen alanlar) derlenen kodlar buraya
- // Kullanılmayan yerler
- // malloc ile bu bölgeye ulaşabilirim
** **
- // malloc ile bu bölgeye ulaşabilirim
malloc-> türden bağımsız (void*)
malloc -> açılan hafıza bloğunun ilk adres değerini verir
void* malloc(size_t nBytes) -> bunun içine kaç bytelık yer ayırayım. Start adresi burda alıyoruz.
)Örnek
include<cstdio></cstdio>
#include<cstdlib>
//kütüphaneleri eklendi</cstdlib>
int main
int n
int*pd
printf(“How many elements required”)
scanf(%d,&n)
// int dizi türünden bir dizi tutucam. intpd ile starting adresi alıcam.
-ona göre 10 değişken girersem 40 bytelık alan atayacak (104).
-ya da 2 değişken girersem 20 byte yer atayacak.
pd = malloc(sizeof(int)n)
AMA malloc void türü döndürür. Bizim pd ise int *. o yüzden cast yapmamız gerek.
Güncellenmiş hali;
pd = (int)malloc(sizeof(int)n)
if (pd== NULL){
printf (“ cannot allocate memory”)
exit(EXIT_FAILURE);
}
for(int i= 0 ; i<n; i++) {
pd[i] = i ; ya da *(pd + i) = i;
} // Bu örnekte kendiize spesifik olarak yer atayabildik
Örnek 2 (ayırdığıımız yeri silmek) FREE foksiyonu olarak (delete)
Dinamik bellekte ayrılmış olan yeri hafızaya geri verir.
compiler ile atanan değerleri hafızaya geri veremeyiz o yüzden dinamik olarak yer atıyoruz.
int main
int n
int*pd
printf(“How many elements required”)
scanf(%d,&n)
pd = (int)malloc(sizeof(int)n)
for(int i =0; i<n;i++){
(pd +i) = ii;
}
for(int i =0; i<n;i++){
printf(“pd[%d] : %d\n”), i , *(pd +i));
}
free(pd); // bu alanlar boşaltıldı
Örnek 3
Kütüphaneleri ekledikten sonra
int main