C Öğreticisi 27 (Bellek Yönetimi)
Last updated
Was this helpful?
Last updated
Was this helpful?
Bu yazılar 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 <stdlib.h> başlık dosyasında bulunabilir.
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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.
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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.