C Dinamik Bellek tahsisini öğrenmeden önce şunu anlayalım:
C'de Bellek Yönetimi nasıl çalışır?
Temel bir veri türü kullanarak bir değişken bildirdiğinizde, C derleyicisi yığın adı verilen bir bellek havuzundaki değişken için otomatik olarak bellek alanı ayırır .
Örneğin, bir float değişkeni bildirildiğinde tipik olarak 4 bayt (platforma göre) alır. Bu bilgiyi aşağıdaki örnekte gösterildiği gibi sizeof operatörünü kullanarak doğrulayabiliriz.
#includeint main() { float x; printf("The size of float is %d bytes", sizeof(x)); return 0;}
Çıktı şu şekilde olacaktır:
The size of float is 4 bytes
Ayrıca, belirli bir boyuta sahip bir dizi, bitişik bellek bloklarına tahsis edilir, her blok bir öğe için boyuta sahiptir:
#includeint main() { float arr[10];printf("The size of the float array with 10 element is %d", sizeof(arr)); return 0;}
Sonuç:
The size of the float array with 10 element is 40
Şimdiye kadar öğrendiği gibi, temel bir veri türü veya bir dizi bildirilirken, bellek otomatik olarak yönetilir. Bununla birlikte, C'de bellek ayırmak için, programınızı çalıştırana kadar (çalışma zamanı) dizi boyutunun kararsız olduğu bir programı uygulamanıza izin verecek bir işlem vardır. Bu işleme " Dinamik bellek ayırma " denir .
Bu eğitimde öğreneceksiniz-
- C'de Bellek Yönetimi nasıl çalışır?
- C'de Dinamik Bellek Tahsisi
- C malloc () Fonksiyonu
- Free () Fonksiyonu
- C calloc () Fonksiyonu
- calloc () ile malloc () karşılaştırması: Anahtar Farklılıklar
- C realloc () Fonksiyonu
- Dinamik Diziler
C'de Dinamik Bellek Tahsisi
Dinamik Bellek Tahsisi , programlama ihtiyaçlarınıza göre belleğin manuel olarak tahsis edilmesi ve serbest bırakılmasıdır. Dinamik bellek, yığın olarak adlandırdığımız bir alandaki yeni ayrılmış bellek alanına işaret eden işaretçilerle yönetilir ve sunulur.
Artık herhangi bir sorun yaşamadan çalışma zamanında dinamik olarak bir dizi öğe oluşturabilir ve yok edebilirsiniz. Özetlemek gerekirse, otomatik bellek yönetimi yığını kullanır ve C Dinamik Bellek Tahsisi öbeği kullanır.
Fonksiyon | Amaç |
malloc () | İstenen boyuttaki belleği ayırır ve işaretçiyi, ayrılan alanın ilk baytına döndürür. |
calloc () | Bir dizinin elemanlarına yer ayırır. Öğeleri sıfır olarak başlatır ve belleğe bir işaretçi döndürür. |
realloc () | Önceden ayrılmış bellek alanının boyutunu değiştirmek için kullanılır. |
Bedava() | Önceden ayrılmış bellek alanını boşaltır veya boşaltır. |
Yukarıdaki işlevleri uygulamaları ile tartışalım
C malloc () Fonksiyonu
C malloc () işlevi bellek ayırma anlamına gelir. Dinamik olarak bir bellek bloğu tahsis etmek için kullanılan bir fonksiyondur. Belirtilen boyutta bellek alanı ayırır ve boş göstericiyi bellek konumuna işaret eder. Döndürülen işaretçi genellikle void tipindedir. Bu, herhangi bir işaretçiye C malloc () işlevini atayabileceğimiz anlamına gelir.
Malloc () İşlevinin Sözdizimi:
ptr = (cast_type *) malloc (byte_size);
Buraya,
- ptr bir cast_type göstericisidir.
- C malloc () işlevi, ayrılmış bayt_boyutu belleğine bir işaretçi döndürür.
Malloc () örneği:
Example: ptr = (int *) malloc (50)
Bu ifade başarıyla yürütüldüğünde, 50 baytlık bir hafıza alanı ayrılır. Ayrılmış alanın ilk baytının adresi int türündeki ptr işaretçisine atanır.
Başka bir örneği ele alalım:
#includeint main(){int *ptr;ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */if (ptr != NULL) {*(ptr + 5) = 480; /* assign 480 to sixth integer */printf("Value of the 6th integer is %d",*(ptr + 5));}}
Çıktı:
Value of the 6th integer is 480
- * Ptr bildirimi daha sonra farklı bir veri türüne yazıldığında kodu daha sağlam hale getirmek için sizeof (int) yerine sizeof (* ptr) kullanıldığına dikkat edin .
- Bellek yeterli değilse ayırma başarısız olabilir. Bu durumda, bir NULL gösterici döndürür. Bu nedenle, bir NULL işaretçisi olup olmadığını kontrol etmek için kod eklemelisiniz.
- Ayrılan belleğin bitişik olduğunu ve bir dizi olarak değerlendirilebileceğini unutmayın. Dizi elemanlarına erişmek için köşeli parantez [] kullanmak yerine işaretçi aritmetiğini kullanabiliriz. Artış ++ veya + = kullanmak, işaretçi tarafından saklanan adresi değiştirdiğinden, dizi öğelerine başvurmak için + kullanmanızı öneririz.
Malloc () işlevi, yapılar gibi karmaşık veri türlerinin yanı sıra karakter veri türü ile de kullanılabilir.
Free () Fonksiyonu
Değişkenler için bellek, derleme zamanında otomatik olarak serbest bırakılır. Dinamik bellek tahsisinde, belleği açıkça ayırmanız gerekir. Aksi takdirde, yetersiz bellek hatasıyla karşılaşabilirsiniz.
C de hafızayı serbest bırakmak / ayırmak için free () fonksiyonu çağrılır. Programınızda hafızayı boşaltarak, daha sonra kullanım için daha fazla kullanılabilir hale getirirsiniz.
Örneğin:
#includeint main() {int* ptr = malloc(10 * sizeof(*ptr));if (ptr != NULL){*(ptr + 2) = 50;printf("Value of the 2nd integer is %d",*(ptr + 2));}free(ptr);}
Çıktı
Value of the 2nd integer is 50
C calloc () Fonksiyonu
C calloc () işlevi, bitişik tahsis anlamına gelir. Bu işlev, birden çok bellek bloğunu tahsis etmek için kullanılır. Belleği diziler ve yapılar gibi karmaşık veri yapılarına ayırmak için kullanılan dinamik bir bellek ayırma işlevidir.
Malloc () işlevi, tek bir bellek alanı bloğu tahsis etmek için kullanılırken, C'deki calloc (), birden çok bellek alanı bloğunu tahsis etmek için kullanılır. Calloc () işlevi tarafından ayrılan her blok aynı boyuttadır.
Calloc () İşlevinin Sözdizimi:
ptr = (cast_type *) calloc (n, size);
- Yukarıdaki ifade, aynı boyutta n bellek bloğunu ayırmak için kullanılır.
- Bellek alanı tahsis edildikten sonra, tüm baytlar sıfıra başlatılır.
- Ayrılan bellek alanının halihazırda ilk baytında olan işaretçi döndürülür.
Bellek yetersizliği gibi bellek alanı ayırmada bir hata olduğunda, bir boş gösterici döndürülür.
Calloc () örneği:
Aşağıdaki program bir aritmetik dizinin toplamını hesaplar.
#includeint main() {int i, * ptr, sum = 0;ptr = calloc(10, sizeof(int));if (ptr == NULL) {printf("Error! memory not allocated.");exit(0);}printf("Building and calculating the sequence sum of the first 10 terms \ n ");for (i = 0; i < 10; ++i) { * (ptr + i) = i;sum += * (ptr + i);}printf("Sum = %d", sum);free(ptr);return 0;}
Sonuç:
Building and calculating the sequence sum of the first 10 termsSum = 45
calloc () ile malloc () karşılaştırması: Anahtar Farklılıklar
C'deki malloc () ile calloc () arasındaki temel fark aşağıdadır:
Calloc () işlevi genellikle malloc () işlevinden daha uygun ve verimlidir. Her iki işlev de bellek alanı tahsis etmek için kullanılırken, calloc () tek seferde birden çok blok tahsis edebilir. Her seferinde bir bellek bloğu talep etmeniz gerekmez. Calloc () işlevi, daha büyük bellek alanı gerektiren karmaşık veri yapılarında kullanılır.
C'de bir calloc () tarafından ayrılan bellek bloğu her zaman sıfır olarak başlatılırken, C'deki malloc () işlevinde, her zaman bir çöp değeri içerir.
C realloc () Fonksiyonu
C realloc () işlevini kullanarak, önceden ayrılmış belleğe daha fazla bellek boyutu ekleyebilirsiniz. Orijinal içeriği olduğu gibi bırakırken mevcut bloğu genişletir. C'deki realloc (), belleğin yeniden tahsis edilmesi anlamına gelir.
realloc (), önceden ayrılmış belleğin boyutunu azaltmak için de kullanılabilir.
Realloc () İşlevinin Sözdizimi:
ptr = realloc (ptr,newsize);
Yukarıdaki ifade, newsize değişkeninde belirli bir boyutta yeni bir bellek alanı ayırır. Fonksiyonu çalıştırdıktan sonra, işaretçi bellek bloğunun ilk baytına geri dönecektir. Yeni boyut, önceki bellekten daha büyük veya daha küçük olabilir. Yeni tahsis edilen bloğun önceki bellek bloğu ile aynı konuma işaret edip etmeyeceğinden emin olamayız. Bu işlev, yeni bölgedeki tüm önceki verileri kopyalayacaktır. Verilerin güvende kalmasını sağlar.
Realloc () örneği:
#includeint main () {char *ptr;ptr = (char *) malloc(10);strcpy(ptr, "Programming");printf(" %s, Address = %u\n", ptr, ptr);ptr = (char *) realloc(ptr, 20); //ptr is reallocated with new sizestrcat(ptr, " In 'C'");printf(" %s, Address = %u\n", ptr, ptr);free(ptr);return 0;}
C'deki realloc () başarısız bir işlemle sonuçlandığında, bir boş gösterici döndürür ve önceki veriler de serbest bırakılır.
C'de Dinamik Diziler
C'deki Dinamik bir dizi, öğelerin sayısının gerektiği kadar artmasına izin verir. C Dinamik dizi, Bilgisayar bilimi algoritmalarında yaygın olarak kullanılmaktadır.
Aşağıdaki programda, C'de bir Dinamik dizi oluşturduk ve yeniden boyutlandırdık.
#includeint main() {int * arr_dynamic = NULL;int elements = 2, i;arr_dynamic = calloc(elements, sizeof(int)); //Array with 2 integer blocksfor (i = 0; i < elements; i++) arr_dynamic[i] = i;for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]);elements = 4;arr_dynamic = realloc(arr_dynamic, elements * sizeof(int)); //reallocate 4 elementsprintf("After realloc\n");for (i = 2; i < elements; i++) arr_dynamic[i] = i;for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]);free(arr_dynamic);}
Ekranda C Dinamik dizi programının sonucu:
arr_dynamic[0]=0arr_dynamic[1]=1After reallocarr_dynamic[0]=0arr_dynamic[1]=1arr_dynamic[2]=2arr_dynamic[3]=3
Özet
- Yığın içinde gerektiği gibi bellek blokları oluşturarak belleği dinamik olarak yönetebiliriz
- C Dinamik Bellek Tahsisinde, bellek bir çalışma zamanında tahsis edilir.
- Dinamik bellek tahsisi, boyutu esnek olan ve programınızda herhangi bir zamanda değiştirilebilen dizeleri ve dizileri değiştirmenize izin verir.
- Belirli bir yapının ne kadar hafıza kaplayacağına dair hiçbir fikriniz olmadığında bu gereklidir.
- C'deki Malloc (), belirli bir boyuta sahip bellek bloklarının bir çöp değerine başlatıldığı bellek tahsisi anlamına gelen dinamik bir bellek ayırma işlevidir.
- C'deki Calloc (), 0 olarak başlatılan bir zamanda birden çok bellek bloğu ayıran bitişik bir bellek ayırma işlevidir.
- C'deki Realloc (), belleği belirtilen boyuta göre yeniden tahsis etmek için kullanılır.
- Free () işlevi, dinamik olarak ayrılmış belleği temizlemek için kullanılır.