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 uygun veri türüne dönüştürmelisiniz.
#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 ve döndürülen void işaretçisini her zaman üzerinde çalıştığınız veri türüyle eşleşecek şekilde dönüştürün (cast edin).
Görev
KolayHeap üzerinde tek bir tam sayı oluşturmak ve onunla çalışmak için malloc() kullanarak dinamik bellek tahsisini gösteren bir C programı yazın. Programınız şunları yapmalıdır:
- Bir tam sayı için dinamik olarak bellek tahsis etmek üzere
malloc()kullanın - Döndürülen void işaretçisini (pointer) bir tam sayı işaretçisine dönüştürün (cast)
- Kullanıcı girişinden bir tam sayı değeri okuyun
- Giriş değerini, dereference operatörünü kullanarak dinamik olarak tahsis edilen bellekte saklayın
- Saklanan değeri şu formatta yazdırın:
Stored value: [value] - Değerin karesini hesaplayın ve aynı bellek konumunda saklayın
- 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 tahsisinin temel iş akışını göstermelidir: heap'ten bellek talep etmek, verileri saklamak ve işlemek için kullanmak ve tahsis edilen 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: 49Bu zorluk sizi, 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 tahsisi temel kavramıyla tanıştırır.
Kopya kağıdı
malloc() fonksiyonu, program yürütme sırasında yığından (heap) dinamik olarak bellek ayırır. Ayrılacak bayt sayısını alır ve ayrılan bellek bloğuna bir void işaretçisi döndürür veya ayırma başarısız olursa NULL döndürür.
malloc() kullanmak için <stdlib.h> kütüphanesini dahil edin:
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Bir tam sayı için bellek ayırÖnemli noktalar:
- Döndürülen void işaretçisini her zaman uygun veri türüne dönüştürün
- Bellek, açıkça serbest bırakılana kadar kullanılabilir kalır
- Çalışma zamanında tam bellek miktarlarını talep etme esnekliği sağlar
- Gereken doğru bayt sayısını belirlemek için
sizeof()kullanın
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 (cast)
// 3. Girdi değerini ayrılan bellekte saklayın
// 4. Saklanan değeri yazdırın
// 5. Aynı konumda karesini hesaplayın ve saklayın
// 6. Karesi alınmış değeri yazdırın
return 0;
}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
1Pointer Temelleri
Pointer Nedir?Pointer TanımlamaAdres Operatörü (&)Dereference Operatörü (*)NULL Pointer'larÖzet: Pointer Temelleri4Proje: Basit Metin Aracı
Projeye Genel BakışKarakter Sayma2İşaretçiler ve Diziler
İşaretçi Olarak Dizi İsimleriDizi Elemanları - İşaretçilerİşaretçi Aritmetiğiİşaretçilerin KarşılaştırılmasıÖzet: İşaretçi ile Dizi Gezinme5İşaretçiler ve Fonksiyonlar
Değer ile GeçmeFonksiyonlara İşaretçi Göndermeİşaretçiler ile Değişkenleri DeğiştirmeKlasik Bir Örnek: SwapFonksiyonlara Dizi GöndermeÖzet: Fonksiyon İşaretçi Argümanları8Yapılar ve İşaretçiler
Yapılara İşaretçilerOk Operatörü (->)Yapıları Değer ile AktarmaYapı İşaretçilerini AktarmaYapıların Dinamik TahsisiÖzet: Yapıyı Değiştirme - Ptr11Son Tekrar Görevleri
Tekrar: Dinamik String BirleştirmeTekrar: Struct DizisiTekrar: Kelime Frekans Sayacı3Karakter Dizileri ve Stringler
char Dizisi Olarak StringlerNull Sonlandırıcıscanf ile String Girişistrlen() Kullanımıstrcpy() Kullanımıstrcat() Kullanımıstrcmp() KullanımıÖzet: Temel String Fonksiyonları6Bellek Yönetimi
Stack ve Heap BellekDinamik Bellek Ayırma - malloc()Bellek Ayırma için sizeof() KullanımıBellek Ayırma Hatasını Kontrol Etmefree() ile Belleği Serbest Bırakmacalloc() ile Bellek AyırmaÖzet: Dinamik Dizi