C Programlama Dili'ne Giriş

  Dersler
* �ns�z

* Giriş
* Veri Tipleri, De�i�kenler
* Operat�rler
* Temel G/� Fonksiyonlar�
* Temel K�t�phane Fonksiyonlar�
* Kar��la�t�rma Deyimleri
* D�ng�ler
* Fonksiyonlar I
* Fonksiyonlar II
* Diziler
* G�sterici (Pointer) Kavram�
* Katarlar (Stringler)
* Dinamik Bellek Y�netimi
* G�sterici Uygulamalar�
* Yap�lar ve Birlikler
* Dosya Y�netimi
* Bit D�zeyinde �al��mak
* Port Denetimi
* Grafik Kullan�m�
* C Makrolar�

* K�saca C++
* Derleme Se�enekleri
* Tarih-Saat Fonksiyonlar�
* Monte-Carlo Y�ntemleri
* Fortran ve C

* Yararlan�lan Kaynaklar

  C/C++ Derleyicileri
* Dev-C++
* Salford (silversoft FTN95)
* GCC
* Turbo C
* Eclipse IDE
* NetBeans IDE

  D�� Ba�lant�lar
* programlama.com
* C Programc�lar� Derne�i

* C (wikipedia)
* C++ (wikipedia)
* cplusplus.com
* koders.com
* Hot scripts

 

Ders 13: Dinamik Bellek Ynetimi

################---- (%80)

En son gncelleme: Wed, 30 Nov 2011 13:22:02 +0200

Giris

Bir C programi ierisinde, dizilerin boyutu ve ka elemanli oldugu program basinda belirtilirse, derleyici o dizi iin gereken bellek alanini (blgesini) program sonlanincaya kadar sakli tutar ve bu alan baska bir ama iin kullanilamaz [1]. Bu trden diziler statik dizi olarak isimlendirilir. Statik dizinin boyutu programin alismasi esnasinda (run time) degistirilemez.

Fakat, programin alisirken bir dizinin boyutu ve eleman sayisi bazi yntemler kullanilarak degistirilebilir. Bu tr dizilere dinamik dizi denir. Dinamik diziler iin gereken bellek blgesi, derleyici tarafindan isletim sisteminden istenir, kullanilir ve daha sonra istenirse bu blge bosaltirilir. Bu blmde, dinamik dizi kavrami ve dinamik bellek ynetimi anlatilacaktir.


13.1   Dinamik Dizi Fonksiyonlari

ANSI C'de, dinamik diziler isareti kullanilarak ve standart ktphanedeki malloc(), calloc(), realloc() ve free() fonksiyonlarinin yardimiyla ile olusturulur veya bosaltilir. Bu fonksiyonlar Tablo 13.1 de listelenmistir.

Tablo 13.1: stdlib.h ktphanesindeki dinamik bellek fonksiyonlari
Dinamik Bellek Fonksiyonu Aiklama
void *malloc(size_t eleman_sayisi); Bellekte herbiri size_t tipinde olan eleman_sayisi kadar yer (bellek blogu) ayirir. Bu yer verilmezse geriye NULL gnderir.
void *calloc(size_t eleman_sayisi, size_t nbayt); Bellekte herbiri nbayt kadar yer isgal edecek eleman_sayisi kadar bos yer ayirir ve btn bitleri sifirlar. Bu yer ayrilamazsa geriye NULL gnderir.
void *realloc(void *ptr, size_t nbayt); ptr isaretisi ile gsterilen bellek blogunu, nbayt kadar byterek veya klterek degistirir. Bu is gereklesmezse geriye NULL gnderir.
void free(void *ptr); Daha nce ayrilan adresi ptr'de saklanan bellek alaninin bosaltir.

Tamsayi tipinde bir dinamik dizi tanimlanirken asagidaki islem basamaklari izlenmelidir:

      /* dinamik dizi bildirimi */
      int *dizi;

      /* eleman saysini belirle */
      scanf("%d",&n);

     /* n tane bellek blogu isteniyor */
     dizi = (int *) malloc( sizeof(int)*n ); 

     /* Bos yer varmi sorgulaniyor */
     if( dizi == NULL )
        printf("Yetersiz bellek alani\n"), exit(1);
 
     ...
     /* dizi burada kullaniliyor */
     ...

     /* bellek blogu bosaltiliyor */
     free(dizi);  

Program 13.1, eleman sayisi klavyeden girilen bir dizinin aritmetik ortalamasini hesaplar. Eleman sayisi sifir veya negatif bir deger oldugunda, sonsuz dngden ikilir ve program sonlanir. Inceleyiniz.

Program 13.1: Dinamik dizi ile ortalama hesabi
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
39: 
40: 
41: 
42: 
43: 
44: 
45: 
46: 
/* 13prg01.c: Dinamik dizi ile ortalama hesabi */

#include <stdio.h>
#include <stdlib.h>

int main(){

  int n,i;
  float *x, toplam, ort;

  while(1)
  {
        /* dizinin eleman sayisi okunuyor */
        printf("\nEleman sayisini girin: ");
        scanf("%d",&n);

        /* eleman sayisi <= 0 ise dgden ik */
        if( n<=0 )
          break;

        /* bellekten yer isteniyor */
        x = (float *)  malloc( sizeof(float)*n );

       /* istenen yer ayrildi mi? */
       if( x == NULL ){
         puts("Yetersiz bellek alani");
         exit(1);
       }

       /* elemanlar tek tek bellege yazilip toplamlari hesaplaniyor */
       for(toplam =0.0, i=0; i<n; i++){
          printf("%d. eleman: ",i+1);
          scanf("%f",&x[i]);
          toplam += x[i];
       }

       ort = toplam / n;

       printf("Ortalama = %f\n",ort);

       /* ayrilan alan bosaltiliyor */
       free(x);
  }

 return 0;
}

IKTI

Eleman sayisini girin: 2
1. eleman: 4
2. eleman: 6
Ortalama = 5.000000

Eleman sayisini girin: 4
1. eleman: 2
2. eleman: 3
3. eleman: 1
4. eleman: 5
Ortalama = 2.750000

Eleman sayisini girin: 0

Karakter dizileri iinde benzer adimlar uygulanir. Program 13.2'de tanimlanan altKatar() fonksiyonu, bir katarin alt paralarini geri dndrr.

Program 13.2: Bir karakter dizisinin alt paralarinin bulunmasi
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
/* 13prg02.c: Bir katarin paralarini (alt katar) veren fonksiyon */

#include <stdio.h>
#include <stdlib.h>

char *altKatar(char *str, int, int);

int main()
{
   int  i;
   char *s, *parca;

   s = "programlama";

   for(i=0; s[i]; i++)
   {
      parca = altKatar(s, 0, i);
      puts(parca);
   }

 return 0;
}

/* str'nin p1. elemanindan p2. elemanina kadar olan alt katarini gonderir. */
char *altKatar(char *str, int p1, int p2)
{  
   int i, j=0, n;
   static char *alt;
   n = p2 - p1;
 
   /* bellekten yer ayriliyor... */
   alt = (char *) malloc( n*sizeof(char) );

   for(i=p1; i<=p2; i++)
     alt[j++] = str[i];

   return alt;
}

IKTI

p
pr
pro
prog
progr
progra
program
programl
programla
programlam
programlama


13.2   Dinamik Matrisler

Iki veya daha fazla boyuta sahip dinamik dizi olusturmak mmkndr. Bu durumda, gstericiyi gsteren gstericler kullanilir. Program 13.3, bir matrisin elemanlari bulup ekrana yazar.

Program 13.3: Dinamik matris tanimlama
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
39: 
40: 
41: 
42: 
43: 
44: 
45: 
46: 
47: 
48: 
49: 
50: 
/* 13prg02.c: Dinamik matris tanimlama */

#include <stdio.h>
#include <stdlib.h>

int main() 
{
    int **matris;
    int satir, kolon;
    int s, k;
    int i;

    printf("Matrisin satir sayisi: ");
    scanf("%d", &satir);

    printf("Matrisin kolon sayisi: ");
    scanf("%d", &kolon);

    /* distaki dizi iin bellek alani isteniyor  */
    matris = (int **) calloc(satir, sizeof(int));

    /* iteki dizi iin bellek alani isteniyor */
    for(i = 0; i < satir; i++)
	matris[i] = (int *) calloc(kolon, sizeof(int));

    /* matrisin elemanlari okunuyor */
    for(s = 0; s < satir; s++)
	for(k = 0; k < kolon; k++) {
	    printf("Matrisin elemani girin: matris[%d][%d] = ", s, k);
	    scanf("%d", &(matris[s][k]));
        }

    printf("\nGirilen matris:\n");

    for(s = 0; s < satir; s++) {
	for(k = 0; k < kolon; k++)
	    printf("%4d", matris[s][k]);

        printf("\n");
    }

    /* iteki dizi bosaltiliyor */
    for(i = 0; i < satir; i++)
	free((void *) matris[i]);

    /* distaki dizi bosaltiliyor */
    free((void *) matris);

    return(0);
}

IKTI

Matrisin satir sayisi: 2
Matrisin kolon sayisi: 3
Matrisin elemani girin: matris[0][0] = 1
Matrisin elemani girin: matris[0][1] = 2
Matrisin elemani girin: matris[0][2] = 3
Matrisin elemani girin: matris[1][0] = 5
Matrisin elemani girin: matris[1][1] = 6
Matrisin elemani girin: matris[1][2] = 8

Girilen matris:
   1   2   3
   5   6   8



Powered by PHP