27 : Dinamik Bellek Kullanımı
Daha önce diziler konusunda diziler kullanılırken bir sınır belirtmek gerektiğini söylemiştik. Örneğin kullanıcıdan sayı girmesi istenilecekse olabilecek bir maximum değer öngörülüp dizi tanımlanırken bu değer kullanılır.
Buna alternatif olarak belleği dinamik olarak da ayırıp kullanabiliriz. Program çalışırken bellekten belli bir bölüm ilgili iş için kullanılıp daha sonra boşaltılabilir. Burada dikkat edilmesi gereken kullanacağımız belleğin gerçekten ayrılmış olmasını kontrol etmek ve kullandıktan sonra gerekiyorsa ilgili alanı boşaltmak. Kontrol etmediğimiz takdirde belleğin ayrılamaması durumunda programın sonlanması; boşaltmamamız durumunda ise "memory leak" denilen belleğin tükenmesi sorunuyla karşılaşırız.
Nasıl kullanıldığını görmek için bir örnekle kullanıcıdan bir miktar girmesini isteyip bu miktarda rastgele sayı oluşturup yazdıralım.
malloc kullanılarak bellek ayrılırsa herhangi bir işlem yapılmaz, sadece istenilen miktarda bellek ayrılır. calloc ise belleği ayırdıktan sonra sıfırlar. Bu sebeple malloc kullanılırsa belleğin yaratıldığından emin olduktan sonra aşağıdaki gibi bir komutla sıfırlamak doğru olur.
#define MAX 1024
int dizi[MAX];
Buna alternatif olarak belleği dinamik olarak da ayırıp kullanabiliriz. Program çalışırken bellekten belli bir bölüm ilgili iş için kullanılıp daha sonra boşaltılabilir. Burada dikkat edilmesi gereken kullanacağımız belleğin gerçekten ayrılmış olmasını kontrol etmek ve kullandıktan sonra gerekiyorsa ilgili alanı boşaltmak. Kontrol etmediğimiz takdirde belleğin ayrılamaması durumunda programın sonlanması; boşaltmamamız durumunda ise "memory leak" denilen belleğin tükenmesi sorunuyla karşılaşırız.
Nasıl kullanıldığını görmek için bir örnekle kullanıcıdan bir miktar girmesini isteyip bu miktarda rastgele sayı oluşturup yazdıralım.
dinamik.c
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int i, num; int *data; time_t t; printf("Kac adet sayi olusturulsun: "); scanf("%d", &num); data = (int*) calloc(num, sizeof(int)); if(data == NULL) { printf("Hata!! Bellek yetersiz \n"); exit(0); } srand((unsigned) time(&t)); for(i = 0; i < num; ++i) { *(data + i) = rand() % 100; } for(i = 0; i < num; ++i) { printf("%d. sayi = %d\n", i, *(data+i)); } free(data); return 0; }
malloc kullanılarak bellek ayrılırsa herhangi bir işlem yapılmaz, sadece istenilen miktarda bellek ayrılır. calloc ise belleği ayırdıktan sonra sıfırlar. Bu sebeple malloc kullanılırsa belleğin yaratıldığından emin olduktan sonra aşağıdaki gibi bir komutla sıfırlamak doğru olur.
memset(data, 0, num*sizeof(int))
Yorumlar
Yorum Gönder