20
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Ü

DİNAMİK BELLEK YÖNETİMİ - Nesibe YALÇIN · 2018. 10. 5. · 3 Dinamik Bellek Yönetimi ―İşletim sisteminden yararlanarak sistemden yer isteme işlemine hafızada yer açma

  • 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.