Giriş |  Kayıt

Yeni başlık gönder Başlığa cevap ver

15 Ara 2010 17:41

Süper Moderatör
Kullanıcı avatarı
Kayıt: 14 Kas 2008 15:55
Başlıklar: 17709
Mesajlar: 18652
Çevrimdışı

C de Dinamik Hafıza Ayırma


C dilinde yazılan bir program bilgisayarda kullandığı belleği bazı parçalara ayırarak kullanır. Windows XP altında çalışan programlarda toplamda 4 GB olan bu bellek bazı bölümlere ayrılır. Program bölümü, kalıcı değişken bölümü, yerel değişkenlerin kullandığı yığıt ve dinamik hafıza ayırma işlemlerini yaptığımız yığın. İşletim sisteminden yararlanarak sistemden yer isteme işlemine hafızada yer açma (memory allocation) denir. C dili bu işlemi “stdlib.h” kütüphanesinde tanımlanmış bazı fonksiyonlar aracılığıyla yapmamızı sağlar. Bunlar, hafızada yer açmamızı sağlayacak olan malloc( ) fonksiyonu ve işimiz bittiğinde kullandığımız hafızayı iade etmemizi sağlayacak olan free( ) fonksiyonudur. Bunların dışında bu kütüphanede calloc( ) ve realloc( ) fonksiyonları da tanımlanmıştır. Bu fonksiyonları pointer larla kullanacağımızı unutmayalım. Şimdi bu fonksiyonlara bir bakalım:



malloc( )


Yığında yer açmamızı sağlayacak olan malloc( ) fonksiyonunun genel prototipi şöyledir:



void * malloc(int size)



Burada size ile ifade edilen yere istenen byte sayısı girilir. Byte sayısını hatalı girebiliriz bu yüzden burada sizeof( ) fonksiyonu kullanılmalıdır. Hem bu sayede bi int veya float tipinin kaç byte yer ayırdığını aklımızda tutmak zorunda kalmayız. Bu yüzden bırakalım da bu konuyu bize hazır sunulan sizeof( ) fonksiyonu düşünsün. Hem malloc( ) kullanımını hem de sizeof( ) kullanımını bir örnekle görelim:



Örnek:



int *p;

p= malloc( sizeof(int) );





Dinamik hafıza ayırma fonksiyonlarını pointerlarla kullanacağımızı söylemiştik. Bunun için önce bir p pointerı tanımladık ve mallocla ayırdığımız yeri bu p pointerına döndürdük.



malloc( ) fonksiyonu default olarak void bir değer döndürür. Bu, ayrılan hafızanın başlangıç adresidir. Bu yüzden bu fonksiyonu her kullandığımızda gerçekten bu istediğimiz yer ayrıldı mı diye kontrol etmek gerekir. Eğer fonksiyon başarılı olamamışsa NULL değer döndürür. Fark ettiyseniz, yukarıdaki örnekte malloc( ) fonksiyonunun döndürdüğü void değeri int türündeki bir değişkene atadık. Aslında bu bir hata olmalı ama C dili bu hatayı görmezden gelir ve tip dönüşümünü kendisi yapar. Biz gene de bu tip dönüşümünü kendimiz yapsak olur.



int *p;

p= (int*) malloc( sizeof(int) );





diye yazabiliriz. Bu hatayı görmezden gelme C++ta sözkonusu değildir. Bir C++ programında bu dönüşümü mecbur yapmamız gerekir. Bu yüzden C veya C++ , tür dönüşümünü kendimiz yazsak bir şey kaybetmeyiz herhalde.



free( )



Program sona erdiğinde ayırdığımız hafızayı yığına iade etmemiz gerekir. C dili kullanıldıktan sonra iade edilmeyen hafızayı “çöp” olarak nitelendirir. Bu çöpü bizim toplamamız gerekir. Bunun için free( ) fonksiyonu kullanılır. Prototipi şöyledir:



void free( void *p);



Örneğin deminki örnekten yola çıkarsak, malloc( ) ile açtığımız hafızayı p pointerına döndürmüştük. İşimiz bittiğinde free( ) fonksiyonunu kullanarak açtığımız bu yeri iade edeceğiz. Bunun için,



int *p;

p= (int*) malloc( sizeof(int) );



free(p);



yazmamız yeterlidir.



Şimdi buraya kadar gördüğümüz malloc( ) ve free( ) fonksiyonlarını kullandığımız bir örnek verelim.

Örnek:



#include <stdio.h>

#include <stdlib.h>

#define YER 1000



void main(void)

{

int *p, i;



/* YER=1000 boyutunda ve int türünde yer acalım */

p = (int *) malloc(YER * sizeof(int));



/* artık p yi 1000 boyutunda bir dizi olarak kullanabiliriz */

for (i=0; i < YER; i++) {

/* bu dizi elemanlarına rastgele degerler atayalım */

p[i] = rand();

}



/* isimiz bitti simdi tesekkur edelim ve bu hafızayı iade edelim */

free(p);

}



Örnek:

Şimdi kullanıcıya kaç sayı gireceğini sorarak ona göre yer açalım ve bu açtığımız diziye kullanıcının istediği değeri girmesini sağlayalım.



int i, kac, *sayilar;



printf(“Kac sayi gireceksiniz:”);

scanf(“%d”,&kac);



sayilar = (int *)malloc(kac*sizeof(int));



for(i=0;i<kac;i++)

{

printf(“Sayi %d:”,i+1);

scanf(“%d”,&(sayilar[i]));

}



calloc( ) ve realloc( )



calloc( ) fonksiyonu aynı malloc( ) gibi hafızada yer açar ve bu açılan byte lara 0 değerini atar. Prototpi şöyledir:



void *calloc(int sayı, boyut);



realloc( ) fonksiyonu ise daha önce malloc( ) ile açılmış hafızanın boyutunu değiştirmek için kullanılır. Prototipi şöyledir:



void *realloc(void *pointer, boyut);



İkisini birden bir örnekte görelim.


Örnek:

Önce calloc( ) ile 5 elemanlık yer açalım ve daha sonra realloc( )la bu yeri genişletelim.



#include<stdio.h>#include <stdlib.h> int main() { int *ptr; int i; ptr = calloc(5, sizeof(int)); if(ptr!=NULL) { //burada hafızanın acılıp acılmadıgını kontrol ettik *ptr = 1; *(ptr+1) = 2; ptr[2] = 4; ptr[3] = 8; ptr[4] = 16; ptr = realloc(ptr, 7*sizeof(int)); if(ptr!=NULL) { ptr[5] = 32; ptr[6] = 64; for(i=0 ; i<7 ; i++) { printf("ptr[%d]=%d\n", i, ptr[i]); } realloc(ptr,0); /* free(ptr); ile aynı işi yapar */ return 0; } else { printf("yeterli hafiza yok realloc calismadi.\n"); return 1; } } else { printf("yeterli hafıza yok calloc calismadi.\n"); return 1; }}


Başa Dön Başa Dön
 
 
Eskiden itibaren mesajları göster:  Sırala  
Yeni başlık gönder Başlığa cevap ver
 1. sayfa (Toplam 1 sayfa)  [ 1 mesaj ] 

Tüm zamanlar UTC + 2 saat [ GITZ ]


Kimler çevrimiçi

Bu forumu gezen kullanıcılar: Hiç bir kayıtlı kullanıcı yok ve 0 misafir


Bu foruma yeni başlıklar gönderemezsiniz
Bu forumdaki başlıklara cevap veremezsiniz
Bu forumdaki mesajlarınızı düzenleyemezsiniz
Bu forumdaki mesajlarınızı silemezsiniz


Aranacak:
Geçiş yap:  

Site haritası


memurlar Toner windows 8 indir Grafik Tasarım kanal d oyunları silah oyunları araba oyunları ukash ukash kart maurers satılık daire kamp çadırı