malloc ve free
Yığın üzerinde ayırma yapın
malloc ve free, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.
Yığın
Şimdiye kadar değişkenler, sabit bir yaşam süresiyle yığında tutuldu. Öbek, çalışma zamanında bellek istemenize ve ihtiyacınız olduğu sürece bu belleği korumanıza olanak tanır.
Öbek belleğini <stdlib.h> işlevlerini kullanarak kendiniz yönetirsiniz.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = malloc(sizeof(int));
*p = 99;
printf("%d\n", *p);
free(p);
return 0;
}malloc Çağrısı
malloc(size), size bayt ayırır ve bu baytlara bir işaretçi döndürür; başarısız olursa NULL döndürür.
Bellek başlatılmamıştır: içeriği belirsizdir.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = malloc(sizeof(int));
*p = 7;
printf("value = %d\n", *p);
free(p);
return 0;
}sizeof ile Boyutlandırma
Kodun her platformda doğru çalışması için ayırmaların boyutunu her zaman sizeof ile belirleyin.
sizeof(*p) yazmak, boyutu otomatik olarak işaretçinin türüne bağlar.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
double *p = malloc(sizeof(*p));
*p = 3.14;
printf("%f\n", *p);
free(p);
return 0;
}NULL Denetimini Asla Atlamayın
Ayırma başarısız olursa malloc, NULL döndürür. Bu işaretçinin gösterdiği yere başvurmak programı çökertebilir.
Sonucu kullanmadan önce denetleyin.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = malloc(sizeof(int));
if (p == NULL) {
printf("allocation failed\n");
return 1;
}
*p = 5;
printf("ok: %d\n", *p);
free(p);
return 0;
}Dizi Ayırma
Birçok öğe tutmak için öğe boyutunu sayıyla çarpın.
malloc(n * sizeof(int)), n tamsayı için yer oluşturur.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = 5;
int *arr = malloc(n * sizeof(int));
for (int i = 0; i < n; i++) arr[i] = i * i;
for (int i = 0; i < n; i++) printf("%d ", arr[i]);
printf("\n");
free(arr);
return 0;
}Öbek Dizileri İşaretçi Dizinelemeyi Kullanır
Öbek dizisine, tanıdık arr[i] söz dizimiyle işaretçisi üzerinden erişilir; bu ifade *(arr + i) ile aynıdır.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *arr = malloc(3 * sizeof(int));
arr[0] = 10;
*(arr + 1) = 20;
arr[2] = 30;
printf("%d %d %d\n", arr[0], arr[1], arr[2]);
free(arr);
return 0;
}Belleği Serbest Bırakma
free(p), bloğu bellek ayırıcısına geri verir. Bundan sonra bu belleğe erişmek için p kullanmamalısınız.
Başarılı olan her malloc çağrısının karşılığında bir free çağrısı bulunmalıdır.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *buf = malloc(16);
if (buf) {
buf[0] = 'A';
printf("%c\n", buf[0]);
free(buf);
}
return 0;
}free(NULL) Güvenlidir
NULL bir işaretçi üzerinde free çağrısı yapmak hiçbir şey yapmaz ve tamamen yasaldır.
Bu, ayırma başarılı olmadan önce çalışabilecek temizleme kodunu basitleştirir.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = NULL;
free(p);
printf("free(NULL) was safe\n");
return 0;
}Öbek Belleği Döndürme
Yığın değişkenlerinin aksine, öbek belleği işlev döndükten sonra da varlığını sürdürür. Bu, bir işlevin arabellek ayırıp bunu geri vermesine olanak tanır.
#include <stdio.h>
#include <stdlib.h>
int *make_range(int n) {
int *a = malloc(n * sizeof(int));
for (int i = 0; i < n; i++) a[i] = i;
return a;
}
int main(void) {
int *r = make_range(4);
printf("%d %d\n", r[0], r[3]);
free(r);
return 0;
}C'de malloc için Tür Dönüşümü Yapmayın
C'de malloc, otomatik olarak herhangi bir işaretçi türüne dönüştürülebilen bir void * döndürür.
Tür dönüşümü gereksizdir ve eksik bir <stdlib.h> eklemesini gizleyebilir.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
long *p = malloc(sizeof(long));
*p = 1234567L;
printf("%ld\n", *p);
free(p);
return 0;
}İki Kez Serbest Bırakmayın
Aynı işaretçi üzerinde iki kez free çağrısı yapmak tanımsız davranıştır ve öbeği bozabilir.
Yanlışlıkla yeniden kullanılmasını zararsız hâle getirmek için serbest bıraktıktan sonra işaretçiyi NULL olarak ayarlayın.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = malloc(sizeof(int));
*p = 1;
free(p);
p = NULL;
free(p);
printf("no double free\n");
return 0;
}Hızlı Kontrol
malloc ve free hakkındaki bilginizi sınayın.
Özet
Öbek ayırmanın temellerini öğrendiniz:
malloc(size), başlatılmamış baytlar ayırır; başarısız olursaNULLdöndürür.- Sonucu ve boyutu her zaman
sizeofile denetleyin. free(p)belleği geri verir; her malloc çağrısının karşılığında bir free çağrısı gerekir.free(NULL)güvenlidir; belleği iki kez serbest bırakmak tanımsızdır.
Sıkça Sorulan Sorular
“malloc ve free” dersi ücretsiz mi?
Evet — “malloc ve free” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.
“malloc ve free” dersinde ne öğreneceğim?
Yığın üzerinde ayırma yapın C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“malloc ve free” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- malloc ve free
- calloc ve realloc
- Bellek Sızıntıları
- Sarkan İşaretçiler