# C Öğreticisi 27 (Bellek Yönetimi)

Bu yazılar [www.tutorialspoint.com/cprogramming/](http://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 \<stdlib.h> başlık dosyasında bulunabilir.![](https://miro.medium.com/max/60/1*-mP3lS_mAXFBykfNnwuTSQ.png?q=20)![](https://miro.medium.com/max/2696/1*-mP3lS_mAXFBykfNnwuTSQ.png)

## Belleği Dinamik Olarak Ayırma <a href="#id-1c05" id="id-1c05"></a>

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.

## Belleği Yeniden Boyutlandırma ve Serbest Bırakma <a href="#id-4e42" id="id-4e42"></a>

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.

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