13.1 Dinamik Dizi Fonksiyonları
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 Fonksiyonu | Açıklama |
void *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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/* dinamik dizi bildirimi */ int *dizi; /* eleman saysını belirle */ scanf("%d",&n); /* n tane bellek bloğu isteniyor */ dizi = (int *) malloc( sizeof(int)*n ); /* Boş yer varmı sorgulanıyor */ if( dizi == NULL ) printf("Yetersiz bellek alanı\n"), exit(1); ... /* dizi burada kullanılıyor */ ... /* bellek bloğu boşaltılıyor */ free(dizi); |
Program 13.1, eleman sayısı klavyeden girilen bir dizinin aritmetik ortalamasını hesaplar. Eleman sayısı sıfır veya negatif bir değer olduğunda, sonsuz döngüden çıkılır ve program sonlanır. İnceleyiniz.
Program 13.1: Dinamik dizi ile ortalama hesabı
1 2 3 4 5 6 7 8 9 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 hesabı */ #include <stdio.h> #include <stdlib.h> int main(){ int n,i; float *x, toplam, ort; while(1) { /* dizinin eleman sayısı okunuyor */ printf("\nEleman sayısını girin: "); scanf("%d",&n); /* eleman sayısı <= 0 ise dögüden çık */ if( n<=0 ) break; /* bellekten yer isteniyor */ x = (float *) malloc( sizeof(float)*n ); /* istenen yer ayrıldı mı? */ if( x == NULL ){ puts("Yetersiz bellek alanı"); exit(1); } /* elemanlar tek tek belleğe yazılıp toplamları hesaplanıyor */ 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); /* ayrılan alan boşaltılıyor */ free(x); } return 0; } |
ÇIKTI
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Eleman sayısını girin: 2 1. eleman: 4 2. eleman: 6 Ortalama = 5.000000 Eleman sayısını girin: 4 1. eleman: 2 2. eleman: 3 3. eleman: 1 4. eleman: 5 Ortalama = 2.750000 Eleman sayısını girin: 0 |
Karakter dizileri içinde benzer adımlar uygulanır. Program 13.2’de tanımlanan altKatar() fonksiyonu, bir katarın alt parçalarını geri döndürür.
Program 13.2: Bir karakter dizisinin alt parçalarının bulunması
1 2 3 4 5 6 7 8 9 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 katarın parçalarini (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 katarını gonderir. */ char *altKatar(char *str, int p1, int p2) { int i, j=0, n; static char *alt; n = p2 - p1; /* bellekten yer ayrılıyor... */ 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