Her Yönüyle C
Would you like to react to this message? Create an account in a few clicks or log in to continue.
Her Yönüyle C

Hepsi Burada
 
AnasayfaAnasayfa  PortalliPortalli  GaleriGaleri  AramaArama  Latest imagesLatest images  Kayıt OlKayıt Ol  Giriş yapGiriş yap  

 

 DİNAMİK BELLEK

Aşağa gitmek 
YazarMesaj
Admin
Admin
Admin


Erkek
Mesaj Sayısı : 804
Yaş : 35
Location : KoCaElİ
Kayıt tarihi : 29/10/07

Character sheet
Field:
DİNAMİK BELLEK Left_bar_bleue100/100DİNAMİK BELLEK Empty_bar_bleue  (100/100)

DİNAMİK BELLEK Empty
MesajKonu: DİNAMİK BELLEK   DİNAMİK BELLEK Icon_minitimePtsi Kas. 12, 2007 2:28 am

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 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: /* 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
Sayfa başına dön Aşağa gitmek
https://cprogramlama.yetkin-forum.com
 
DİNAMİK BELLEK
Sayfa başına dön 
1 sayfadaki 1 sayfası

Bu forumun müsaadesi var:Bu forumdaki mesajlara cevap veremezsiniz
Her Yönüyle C :: C Programlama :: C Konu Anlatımları-
Buraya geçin: