Dinamik Bellek Ayırma - malloc()
Coddy'nin C Journey'sinin Mantık & Akış bölümünün bir parçası. Ders 32 / 63.
Şimdi, program yürütülürken yığından bellek istemek için kullanılan temel işlev olan malloc() hakkında bilgi edineceksin. malloc() işlevinin adı "memory allocation" ifadesinin kısaltmasıdır ve derleme zamanında sabit boyutlu değişkenler tanımlamak yerine, ihtiyaç duyduğunda dinamik olarak bellek ayırmana olanak tanır.
malloc() işlevi tek bir bağımsız değişken alır: ayırmak istediğiniz bayt sayısı. 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. Bir void işaretçisi döndürdüğü için, onu doğrudan türü belirtilmiş bir işaretçiye atayabilirsiniz; C'de tür dönüştürme isteğe bağlıdır (bunu gerektiren C++'ın aksine).
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Bir tamsayı için bellek ayır
// ptr artık bir tamsayı tutabilen bir bellek konumuna işaret ediyor
malloc()işlevinin temel avantajı esnekliktir: çalışma zamanında tam olarak ihtiyacınız olan bellek miktarını isteyebilirsiniz ve bu bellek, siz onu açıkça serbest bırakana kadar kullanılabilir durumda kalır. Bu, özellikle programınız çalışana kadar ne kadar belleğe ihtiyaç duyacağınızı bilmiyorsanız oldukça kullanışlıdır.
malloc() kullanmak için <stdlib.h> eklemeyi unutma; döndürülen void işaretçisini dönüştürmek C'de isteğe bağlıdır, çünkü işaretçi atadığın türe otomatik olarak dönüştürülür.
Görev
KolayYığında tek bir tamsayı 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:
- Bir tamsayı için dinamik olarak bellek ayırmak üzere
malloc()kullanın - Döndürülen void işaretçisini bir tamsayı işaretçisine dönüştürün
- Kullanıcı girdisinden bir tamsayı değeri okuyun
- Başvuru kaldırma operatörünü kullanarak girdi değerini dinamik olarak ayrılan bellekte depolayın
- Depolanan değeri şu biçimde yazdırın:
Stored value: [value] - Aynı bellek konumunda değerin karesini hesaplayıp depolayın
- Karesi alınmış değeri şu biçimde yazdırın:
Squared value: [value]
<stdlib.h> kullanmak için malloc() başlığını eklemeyi unutmayın. Programınız, dinamik bellek ayırmanın temel iş akışını göstermelidir: yığından bellek istemek, verileri depolamak 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: 49Bu görev, belleğin derleme zamanında sabitlenmek yerine çalışma zamanında istendiği ve programlarınıza bellek kullanımında daha fazla esneklik sağlayan temel dinamik bellek ayırma kavramını 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 tamsayı için bellek ayırmak üzere malloc() kullanın
// 2. Döndürülen işaretçiyi int* olarak dönüştürün
// 3. Girdi değerini ayrılan bellekte saklayın
// 4. Saklanan değeri yazdırın
// 5. Karesini hesaplayın ve aynı konumda saklayın
// 6. Print the squared value
return 0;
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık & Akış 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 DiziKendi başına pratik yap: Online C derleyicisi