Dinamik Bellek Ayırma Nedir?
C ve C++ gibi yazılım dillerinde, nitelikli uygulamalar geliştirmek için dinamik belleği daha etkin bir biçimde kullanmamız gerekmektedir. Program normal şartlarda ihtiyaç duyulan bellek tahsisini ve bellek boşaltma işlemlerini işlem satırlarında yer alan kodlara uygun olarak yapar. Ancak, bazı durumlarda, değişkenlere atanacak verilerin boyutu ve ihtiyaç duyulan bellek miktarı programın çalışması esnasında belirlenebileceğinden, bellek tahsis ve boşaltma işlemlerini program çalışması esnasında dinamik olarak hayata geçirmek gerekir. Bu işlemleri üç temel başlık altında sınıflandırabiliriz
Dizi tanımlaması gibi yapılan bazı işlemler belleğin otomatik şekilde tahsis edilmesini sağlarken, bazı işlemler bu imkanı sağlamaz. Bu durumda, programın çalışması esnasında gereksinim duyduğumuzda bellek tahsis edebiliriz. Bu işleme dinamik bellek kullanımı yöntemi adı verilir.
- Malloc() ve free() fonksiyonu
- calloc() fonksiyonu
- realloc() fonksiyonu
Malloc() fonksiyonu
Dinamik bellek kullanımı için genelde malloc() ve free() özellikleri beraber kullanılır. Malloc() fonksiyonu belleği tahsis ederken, free() fonksiyonu ise daha önce tahsis edilmiş belleği boşa çıkartır.
void *malloc (size_t bye-sayısı); void free (void *p);
#include <stdio.h> #include <stdlib.h> int main(void) { int *ip; // int veri türü boyutu kadar bellek tahsisi ip = (int*) malloc(sizeof(int)); *ip = 126; printf(“Tahsis edilen bellek adres başlangıcı: %p\n”, ip); printf(“Tahsis edilen bellekteki değişken değeri: %d”, *ip); free(ip); return 0; }
Tahsis edilen bellek adres başlangıcı: 00ec1ab0 Tahsis edilen bellekteki değişken değeri: 126
Calloc() fonksiyonu
Bellek tahsislerinde calloc() fonksiyonu da kullanılabilir. Bu fonksiyonun malloc() fonksiyonundan tek farkı ayrılacak bellek miktarının eleman boyutu ve eleman sayısı olarak iki argüman halinde tanımlanmış olmasıdır.
void *calloc (size_t elem-say, size_t elem_boy);
ip = malloc (10 * sizeof(int)); ip = calloc (10, sizeof(int));
#include <stdio.h> #include <stdlib.h> int main(void) { int *ip, id; ip = (int *) calloc(5, sizeof(int)); for (id=0; id<5; id++) { *(ip+id) = (id+1) * 10; printf(“%p adresindeki değer: %d\n”, (ip+id), *(ip+id)); } free(ip); return 0; }
00180538 adresindeki değer: 10 0018053c adresindeki değer: 20 00180540 adresindeki değer: 30 00180544 adresindeki değer: 40 00180548 adresindeki değer: 50
Realloc() fonksiyonu
realloc() fonksiyonu, önceden malloc(), calloc() ya da realloc() fonksiyonu ile tahsis edilen belleğin boyutunu, boyutu byte olarak ifade edilen size parametre değeri kadar, değiştirir.
void* realloc(void *ptr, size_t size);
#include <stdio.h> #include <stdlib.h> int main(void) { int *ip, id; ip = (int *) malloc(5* sizeof(int)); for (id=0; id<5; id++) { *(ip+id) = id+1; printf(“%p adresindeki değer: %d\n”, (ip+id), *(ip+id)); } ip = (int *) realloc(ip,10 * sizeof(int)); for ( ; id<10; id++) { //Burada id değişken değeri 5 olarak başlar. printf(“%p adresindeki değer: %d\n”, (ip+id), *(ip+id)); } free(ip); return 0; }
00de1690 adresindeki değer: 1 00de1694 adresindeki değer: 2 00de1698 adresindeki değer: 3 00de169c adresindeki değer: 4 00de16a0 adresindeki değer: 5 Genişletilmiş bellek değerleri: 00de16a4 adresindeki değer: 6 00de16a8 adresindeki değer: 7 00de16acadresindeki değer: 8 00de16b0 adresindeki değer: 9 00de16b4 adresindeki değer: 10
2 boyutlu dizilere dinamik bellek tahsisi
C’de, işaretçi dizileri kullanarak çok boyutlu dizilere dinamik bellek tahsisi yapabiliriz.
#include <stdio.h> #include <stdlib.h> #include <stdlib.h> int main(void) { char *pdizi[5]; int id; // Bellek tahsisi for (id=0; id<5; id++) { pdizi[id] = (char *) malloc(20 * sizeof(char)); } // Dizi atama for (id=0; id<5; id++) { strcpy(pdizi[id], “Karakter dizisi”); } // Yazdırma for (id=0; id<5; id++) { printf(“%s\n”, pdizi[id]); } // Bellek boşaltma for (id=0; id<5; id++) { free(pdizi[id]); } return 0; }
Karakter dizisi Karakter dizisi Karakter dizisi Karakter dizisi Karakter dizisi
Kaynakça https://www.bilgigunlugum.net/prog/cprog/c_dinamik