15 1 0 4000 1 https://haktanbozer.com.tr 300

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

 

Alıntıdır
Paylaş:
Ulam:Nedir?
Önceki Yazı
Dizi Veri Yapısı Nedir?
Sıradaki Yazı
Grundig CG 5960 Y Kullanım Kılavuzu