Upload
others
View
9
Download
0
Embed Size (px)
Citation preview
DİNAMİK BELLEK YÖNETİMİ Programlama dilleri 1
- 8. hafta -
Araş. Gör. Nesibe YALÇIN
BİLECİK ŞEYH EDEBALİ ÜNİVERSİTESİ
MÜHENDİSLİK FAKÜLTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
2
Dinamik Bellek Yönetimi
char ad [20]; ― Derleyici, program başlatılmadan önce bellekte 20 byte (sistemde bir karakter bir byte ise) boyutunda sürekli bir alan tahsis eder.
― Bu dizinin boyutunu program akışı içerisinde değiştirmek mümkün değildir. Ancak yeri geldiğinde bellekte boyutu sabit olmayan ve sürekli değişebilen yerler tahsis edilmesi gerekebilir.
3
Dinamik Bellek Yönetimi
― İşletim sisteminden yararlanarak sistemden yer isteme işlemine hafızada yer açma (memory allocation) denir.
― Dinamik bellek yönetimi ile programın çalışması esnasında (Run-Time) -işletim sistemine danışılarak - sürekli bellek bölgeleri tahsis edilebilir.
― Gereken bellek bölgesi, derleyici tarafından işletim sisteminden istenir, kullanılır ve daha sonra istenirse bu bölge boşalttırılır.
4
Dinamik Bellek Yönetimi
― Sınırsız bellek alanı olmadığından belleği verimli kullanmak gerekmektedir. ― Belleği verimli kullanabilmek her programcının amacı olmalıdır. ― Eğer programcı bellek yönetimini iyi yapamıyorsa daha fazla belleğe ihtiyaç duyar. ― Daha fazla belleğe ihtiyaç duymak; fazla maliyet, programın yavaş çalışması gibi belli başlı birkaç sorunu beraberinde getirir.
5
Dinamik Bellek Yönetimi
― Dinamik bellek yönetim fonksiyonları; • Malloc() • Calloc () • Free () • Realloc ()
― Bu fonksiyonlar, göstericiler (pointer) ile birlikte kullanılırlar ve stdlib.h kütüphanesi içerisinde yer alırlar.
6
Malloc Fonksiyonu
― Programın çalışma zamanı sırasında belleğin güvenli bir bölgesinde istenilen uzunluk kadar yer tahsis eder.
void * malloc (int boyut);
void *dizi, eleman_sayisi=5; dizi = malloc(eleman_sayisi * sizeof(int));
boyut
7
Malloc Fonksiyonu
― Malloc fonksiyonunun geri dönüş değeri olan void gösterici farklı türde göstericisi olan bir diziye atanmak istenirse tip dönüşümü yapılır:
int *dizi = (int*) malloc(eleman_sayisi * sizeof(int)); char *dizi = (char*) malloc(eleman_sayisi * sizeof(char));
float*dizi = (float*) malloc(eleman_sayisi * sizeof(float));
8
Malloc Fonksiyonu
― Eğer fonksiyon başarılı olamamışsa NULL değerini geri döndürür:
#include
#include
#include
#define N 6
void main()
{
double *dizi;
dizi = (double*)malloc(N*sizeof(double));
if( dizi == NULL )
{
printf("Yetersiz bellek alanı\n");
exit(1);
}
printf("%d byte bellekte yer ayrildi",(N*sizeof(double)));
getch();
}
9
Malloc Fonksiyonu
#include
#include
#include
#include
void main(){
int boyut=0, i=0;
int *dizi;
printf("Dizi boyutunu girin:");
scanf("%d",&boyut);
dizi=(int *)malloc((boyut*sizeof(int)));
srand(time(NULL));
for(i=0;i
10
Calloc Fonksiyonu
― İki parametre ile kullanılır: Eleman sayısı ve Eleman boyutu.
void * calloc (int sayi, int boyut);
― Eleman sayısı ile eleman boyutu çarpımı kadar (byte) bellek bölgesi ayırır. Malloc’dan farklı olarak dinamik olarak ayırdığı bellek bölgesini sıfırlamaktadır.
int *dizi, eleman_sayisi=5; dizi = (int*) calloc(eleman_sayisi, sizeof(int));
11
Calloc Fonksiyonu
― İki parametre ile kullanılır: • Eleman sayısı • Eleman boyutu Eleman sayısı ile eleman boyutu çarpımı kadar (byte)
bellek bölgesi ayırır. void * calloc (int sayi, int boyut);
12
Calloc Fonksiyonu
#include
#include
#include #include
void main() {
int n,i;
float *x, toplam=0.0, s_sapma;
printf("Eleman sayisi: ");
scanf("%d",&n);
x = (float*)calloc(n, sizeof(float));
if( x == NULL ){
puts("Yetersiz bellek alanı");
exit(1); }
for(i=0; i
13
Realloc Fonksiyonu
― Malloc veya Calloc fonksiyonları ile ayrılmış bellek bölgesini genişletmek ya da daraltmak amacıyla kullanılır.
― İki parametre alır:
• Daha önce tahsis edilen bloğun başlangıç adresi • Bloğun yeni uzunluğu void *realloc(void *gosterici, int yeniboyut);
14
Realloc Fonksiyonu
― Realloc fonksiyonunu kullanmak için daha önce Malloc veya Calloc fonksiyonunu kullanmak gerekir.
― Realloc fonksiyonu da Malloc fonksiyonu gibi tahsis ettiği bloğa ilk değer vermez.
15
Realloc Fonksiyonu
#include
#include
#include
int main()
{
char *p=(char*)malloc(sizeof(char)*2); //2 byte alan ayrıldı
p[0]='?'; // *p
p[1]='!'; // *(p+1)
p = (char*)realloc(p, sizeof(char)*5); //5 byte alan ayrıldı
p[2]='%';
p[3]='&';
p[4]='"';
for(int i = 0; i < 5; i++)
printf("%c ", p[i]);
getch();
return 0;
}
16
Free Fonksiyonu
― Malloc veya Calloc fonksiyonları ile daha önceden ayrılan bellek bölgesini boşaltmak için kullanılır.
― Parametre olarak daha önce ayrılan bellek bölgesinin başlangıç adresini alır.
void free(void *gosterici); int *dizi = malloc(sizeof(int)*25); free(dizi); // realloc(dizi,0); int **matris; free(matris[1]);
17
Free Fonksiyonu
#include
#include
#include
#include
void main(){
int i,*x;
int adet_tek=0, adet_cift=0;
srand(time(0));
x=(int*)malloc(10*sizeof(int));
for(i=0;i
18
Örnek
#include #include
#include
void main() {
int **matris;
int satir, sutun;
printf("Matrisin satir ve sutun sayisi: ");
scanf("%d %d", &satir, &sutun);
matris = (int **) calloc(satir, sizeof(int));
for(int i = 0; i < satir; i++)
matris[i] = (int *) calloc(sutun, sizeof(int));
for(int i = 0; i < satir; i++)
for(int j = 0; j < sutun; j++) {
printf("Matrisin elemani girin: matris[%d][%d] = ", i,j);
scanf("%d", &(matris[i][j])); }
19
Örnek
puts("Girilen matris:"); for(int i = 0; i < satir; i++) {
for(int j = 0; j < sutun; j++)
printf("%d \t", matris[i][j]);
printf("\n"); }
for(int i = 0; i < satir; i++)
free(matris[i]);
free(matris);
getch(); }
20
Uygulamalar
― 15 elemanlı karakter tipindeki "sanat" isimli dinamik diziyi gösterici kullanarak oluşturunuz. Daha sonra dizi için ayrılmış hafıza alanını boşaltınız.
― int model[10] tanımlaması ile özdeş olan ifadeyi C dilinde yazınız. (NOT: “model" isimli göstericiyi tanımlayarak hafızada alan ayırınız.)
― Elemanları kullanıcı tarafından belirlenen dinamik bir a dizisinin elemanlarını ve adreslerini ekrana yazdırınız.