Menu
Coddy logo textTech

Dinamik Bellek Ayırma - malloc()

Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 32 / 63.

Şimdi, program yürütme sırasında yığından (heap) bellek istemek için kullanılan birincil işlev olan malloc() hakkında bilgi edineceksiniz. malloc() işlevi "bellek tahsisi" (memory allocation) anlamına gelir ve derleme zamanında sabit boyutlu değişkenler bildirmek yerine, ihtiyacınız olduğunda belleği dinamik olarak tahsis etmenize olanak tanır.

malloc() fonksiyonu tek bir argüman alır: tahsis etmek istediğiniz bayt sayısı. Tahsis edilen bellek bloğuna bir void işaretçisi döndürür veya tahsis işlemi başarısız olursa NULL döndürür. Bir void işaretçisi döndürdüğü için, onu doğrudan tipli bir işaretçiye atayabilirsiniz; C'de tür dönüştürme (casting) isteğe bağlıdır (bunu zorunlu kılan C++'ın aksine).

#include <stdlib.h>

int *ptr = (int*)malloc(sizeof(int));  // Bir tam sayı için bellek ayır
// ptr artık bir tam sayı tutabilen bir bellek konumunu işaret ediyor

malloc() fonksiyonunun temel avantajı esnekliktir - çalışma zamanında tam olarak ihtiyacınız olan bellek miktarını talep edebilirsiniz ve bu bellek, siz onu açıkça serbest bırakana kadar kullanılabilir kalır. Bu, programınız çalışana kadar ne kadar belleğe ihtiyacınız olacağını bilmediğiniz durumlarda özellikle yararlıdır.

malloc() kullanmak için <stdlib.h> kütüphanesini dahil etmeyi unutmayın; döndürülen void işaretçisini tür dönüştürmek (casting) C'de isteğe bağlıdır, çünkü atadığınız türe otomatik olarak dönüştürülür.

challenge icon

Görev

Kolay

Heap üzerinde tek bir tam sayı oluşturmak ve onunla çalışmak için malloc() kullanarak dinamik bellek ayırmayı gösteren bir C programı yazın. Programınız şunları yapmalıdır:

  1. Bir tam sayı için dinamik olarak bellek ayırmak üzere malloc() kullanın
  2. Döndürülen void işaretçisini (void pointer) bir tam sayı işaretçisine (integer pointer) dönüştürün (cast)
  3. Kullanıcı girişinden bir tam sayı değeri okuyun
  4. Dereference operatörünü kullanarak giriş değerini dinamik olarak ayrılan bellekte saklayın
  5. Saklanan değeri şu formatta yazdırın: Stored value: [value]
  6. Aynı bellek konumunda değerin karesini hesaplayın ve saklayın
  7. Kare alınmış değeri şu formatta yazdırın: Squared value: [value]

malloc() kullanmak için <stdlib.h> başlık dosyasını eklemeyi unutmayın. Programınız dinamik bellek ayırmanın temel iş akışını göstermelidir: heap'ten bellek talep etmek, verileri saklamak ve işlemek için bu belleği kullanmak ve ayrılan bellekle işaretçi işlemleri aracılığıyla çalışmak.

Örneğin, kullanıcı 7 girerse, çıktınız şöyle olmalıdır:

Stored value: 7
Squared value: 49

Bu zorluk, belleğin derleme zamanında sabitlenmek yerine çalışma zamanında talep edildiği ve programlarınıza bellek kullanımında daha fazla esneklik sağlayan dinamik bellek ayırma temel kavramını size tanıtır.

Kendin dene

#include <stdio.h>
#include <stdlib.h>

int main() {
    // Girdiyi oku
    int input_value;
    scanf("%d", &input_value);
    
    // TODO: Kodunuzu aşağıya yazın
    // 1. Bir tam sayı için bellek ayırmak üzere malloc() kullanın
    // 2. Döndürülen işaretçiyi int* türüne dönüştürün
    // 3. Girdi değerini ayrılan bellekte saklayın
    // 4. Saklanan değeri yazdırın
    // 5. Kareyi hesaplayın ve aynı konumda saklayın
    // 6. Karesi alınmış değeri yazdırın
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Logic & Flow bölümündeki tüm dersler