Giriş Bir C programı içerisinde, dizilerin boyutu ve kaç elemanlı olduğu program başında belirtilirse, derleyici o dizi için gereken bellek alanını (bölgesini) program sonlanıncaya kadar saklı tutar ve bu alan başka bir amaç için kullanılamaz
[1]. Bu türden diziler
statik dizi olarak isimlendirilir. Statik dizinin boyutu programın çalışması esnasında (run time) değiştirilemez.
Fakat, programın çalışırken bir dizinin boyutu ve eleman sayısı bazı yöntemler kullanılarak değiştirilebilir. Bu tür dizilere
dinamik dizi denir. Dinamik diziler için gereken bellek bölgesi, derleyici tarafından işletim sisteminden istenir, kullanılır ve daha sonra istenirse bu bölge boşaltırılır. Bu bölümde, dinamik dizi kavramı ve dinamik bellek yönetimi anlatılacaktır.
13.1 Dinamik Dizi Fonksiyonları ANSI C'de, dinamik diziler işaretçi kullanılarak ve standart kütüphanedeki malloc(), calloc(), realloc() ve free() fonksiyonlarının yardımıyla ile oluşturulur veya boşaltılır. Bu fonksiyonlar Tablo 13.1 de listelenmiştir.
Tablo 13.1: stdlib.h kütüphanesindeki dinamik bellek fonksiyonları Dinamik Bellek FonksiyonuAçıklamavoid *malloc(size_t
eleman_sayısı);
Bellekte herbiri size_t tipinde olan
eleman_sayısı kadar yer (bellek bloğu) ayırır. Bu yer verilmezse geriye NULL gönderir.
void *calloc(size_t
eleman_sayısı, size_t
nbayt);
Bellekte herbiri nbayt kadar yer işgal edecek
eleman_sayısı kadar boş yer ayırır ve bütün bitleri sıfırlar. Bu yer ayrılamazsa geriye NULL gönderir.
void *realloc(void *
ptr, size_t
nbayt);
ptr işaretçisi ile gösterilen bellek bloğunu,
nbayt kadar büyüterek veya küçülterek değiştirir. Bu iş gerçekleşmezse geriye NULL gönderir.
void free(void *
ptr);
Daha önce ayrılan adresi
ptr'de saklanan bellek alanının boşaltır.Tamsayı tipinde bir dinamik dizi tanımlanırken aşağıdaki işlem basamakları izlenmelidir:
/* dinamik dizi işaretçisi */ int *ddi;
...
/* herbiri 4x50 elemanlık bellek bloğu isteniyor */ ddi = (int *) malloc( sizeof(int)*50 );
/* Boş yer varmı sorgulanıyor */ if( ddi==NULL )
printf("Yetersiz bellek alanı\n"), exit(1);
/* kullanılıyor */ .
.
.
/* geri veriliyor */ free(ddi);
...
Program 13.1, eleman sayısı klavyeden girilen bir dizi aritmetik ortalamasını hesaplar. Eleman sayısı sıfır veya sıfırdan küçük bir değer olduğunda program sonlanır. Inceleyiniz.
Program 13.1: Dinamik dizi ile ortalama hesabı
[color=gray] 1: /* 13prg01.c: Dinamik dizi ile ortalama hesabı */ 2: 3: #include <stdio>
4: #include <stdlib>
5: 6: int main(){
7: 8: int n,i;
9: float *x, top, ort;
10: 11: 12: /* dizinin eleman sayısı okunuyor */13: printf("Eleman sayısı: ");
14: scanf("%d",&n);
15: 16: /* eleman sayısı <=0 mı? */17: if( n<=0 ){
18: printf("n<=0\n");
19: exit(1);
20: }
21: 22: /* bellekten yer isteniyor */23: x = (float *) malloc( sizeof(float)*n );
24: 25: /* istenen yer ayrıldı mı? */26: if( x==NULL ){
27: printf("Yetersiz bellek alanı\n");
28: exit(1);
29: }
30: 31: /* elemanlar tek tek istenip toplamları hesaplanıyor */32: top = 0.0;
33: for(i=0;i<n> tcc 13prg01.c
C:\TC> 13prg01
$ gcc 13prg01.c -o 13prg01
$ ./13prg01
ÇIKTI
Eleman sayısı: 4
1. eleman: 11
2. eleman: 22
3. eleman: 33
4. eleman: 44
Ortalama = 27.500000
13.2 Dinamik Matrisler Program 13.2: Dinamik matris tanımlama
[color=gray] 1: /* 13prg02.c: Dinamik matris tanımlama */ 2: 3: #include <stdio>
4: #include <stdlib>
5: 6: int main()
7: {
8: int **matris;
9: int satir, kolon;
10: int s, k;
11: int i;
12: 13: printf("Matrisin satır sayısı: ");
14: scanf("%d", &satir);
15: 16: printf("Matrisin kolon sayısı: ");
17: scanf("%d", &kolon);
18: 19: /* dıştaki dizi için bellek alanı isteniyor */20: matris = (int **) calloc(satir, sizeof(int));
21: 22: /* içteki dizi için bellek alanı isteniyor */23: for(i = 0; i < satir; i++)
24: matris[i] = (int *) calloc(kolon, sizeof(int));
25: 26: /* matrisin elemanları okunuyor */27: for(s = 0; s < satir; s++)
28: for(k = 0; k < kolon; k++) {
29: printf("Matrisin elemanı girin: matris[%d][%d] = ", s, k);
30: scanf("%d", &(matris[s][k]));
31: }
32: 33: printf("\nGirilen matris:\n");
34: 35: for(s = 0; s < satir; s++) {
36: for(k = 0; k < kolon; k++)
37: printf("%4d", matris[s][k]);
38: 39: printf("\n");
40: }
41: 42: /* içteki dizi boşaltılıyor */43: for(i = 0; i <satir> tcc 13prg02.c
C:\TC> 13prg02
$ gcc 13prg02.c -o 13prg02
$ ./13prg02
ÇIKTI
Matrisin satır sayısı: 2
Matrisin kolon sayısı: 3
Matrisin elemanı girin: matris[0][0] = 1
Matrisin elemanı girin: matris[0][1] = 2
Matrisin elemanı girin: matris[0][2] = 3
Matrisin elemanı girin: matris[1][0] = 5
Matrisin elemanı girin: matris[1][1] = 6
Matrisin elemanı girin: matris[1][2] = 8
Girilen matris:
1 2 3
5 6 8