Mozilla Türkiye Gönüllü Topluluğu Blog

C Öğreticisi 27 (Bellek Yönetimi)


Bu yazılar https://www.tutorialspoint.com/cprogramming/ adresindeki yazı dizilerinin çevirileridir.

Bu bölüm C’deki dinamik bellek yönetimini açıklar. C programlama dili bellek tahsisi ve yönetimi için çeşitli fonksiyonlar sağlar. Bu fonksiyonlar başlık dosyasında bulunabilir.

image

Belleği Dinamik Olarak Ayırma

Programlama sırasında, bir dizinin boyutunun farkındaysanız, o zaman işler kolaydır ve onu bir dizi olarak tanımlayabilirsiniz. Örneğin, herhangi bir kişinin adını saklamak için en fazla 100 karaktere kadar gidebilir, böylece bir şeyi aşağıdaki gibi tanımlayabilirsiniz -

	
char ad[100];
	

Ancak şimdi saklamanız gereken metnin uzunluğu hakkında hiçbir fikrinizin olmadığı bir durumu ele alalım, örneğin, bir konu hakkında ayrıntılı bir açıklama saklamak istiyorsunuz. Burada, ne kadar bellek gerektiğini tanımlamaksızın karaktere bir işaretçi tanımlamamız gerekiyor ve daha sonra, gereksinime bağlı olarak, aşağıdaki örnekte gösterildiği gibi bellek ayırabiliriz -

	
#include 
#include 
#include 
int main() {
char ad[100];
char *aciklama;
strcpy(ad, “Zara Ali”);
/* dinamik hafıza ayrılıyor */
aciklama = malloc( 200 * sizeof(char) );
if( aciklama == NULL ) {
fprintf(stderr, “Hata — gereken hafiza ayrilamadi\n”);
} else {
strcpy( description, “Zara Ali 10. sinif bir DPS ogrencisidir);
}
printf(“Ad = %s\n”, ad );
printf(“Aciklama: %s\n”, aciklama );
}
	

Program derlenip çalıştırıldığında -

	
Ad = Zara Ali
Aciklama: Zara Ali 10. sinif bir DPS ogrencisidir
	

Aynı program calloc (); tek şey malloc’u calloc ile aşağıdaki gibi değiştirmeniz gerekiyor -

	
calloc(200, sizeof(char));
	

Böylece tam kontrole sahip olursunuz ve bellek tahsis edilirken herhangi bir boyut değerini iletebilirsiniz, boyut belirlendikten sonra değiştiremediğiniz dizilerden farklı olarak.

Belleği Yeniden Boyutlandırma ve Serbest Bırakma

Programınız çıktığında, işletim sistemi programınız tarafından ayrılan tüm belleği otomatik olarak serbest bırakır, ancak artık belleğe ihtiyacınız olmadığında iyi bir uygulama olarak, fonksiyonu free () diyerek bu belleği serbest bırakmanız gerekir.

Alternatif olarak, realloc () fonksiyonunu çağırarak tahsis edilmiş bir bellek bloğunun boyutunu artırabilir veya azaltabilirsiniz. Yukarıdaki programı bir kez daha kontrol edelim ve realloc () ve free () fonksiyonlarını kullanalım -

	
#include 
#include 
#include 
int main() {
char ad[100];
char *aciklama;
strcpy(ad, “Zara Ali”);
/* dinamik hafıza ayrılıyor */
aciklama = malloc( 30 * sizeof(char) );
if( aciklama == NULL ) {
fprintf(stderr, “Hata — gereken hafiza ayrilamadi\n”);
} else {
strcpy( description, “Zara ali bir DPS ogrencisidir.”);
}
/* daha büyük bir açıklama saklamak istediğinizi varsayalım \n */
aciklama = realloc( aciklama, 100 * sizeof(char) );
if( aciklama == NULL ) {
fprintf(stderr, “Hata — gereken hafiza ayrilamadi\n”);
} else {
strcat( description, “10. siniftadir”);
}
printf(“Ad = %s\n”, ad );
printf(“Aciklama: %s\n”, aciklama );
/* free() fonksiyonunu kullanarak belleği serbest bırakın */
free(aciklama);
}
	

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir.

	
Name = Zara Ali
Aciklama: Zara ali bir DPS ogrencisidir.10. siniftadir
	

Ek belleği yeniden ayırmadan yukarıdaki örneği deneyebilirsiniz ve strcat () işlevi, kullanılabilir bellek eksikliğinden dolayı hata verecektir.

https://www.tutorialspoint.com/cprogramming/c_memory_management.htm

Bir sonraki yazıya buradan ulaşabilirsiniz.