0Pricing
C Academy · Ders

Dizi Ayırma

Yığın belleği ayırın.

Dizi Ayırma, 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.

Dinamik Diziler Neden Gerekli

Normal bir dizinin boyutu derleme zamanında belirlenir ve sabittir. Ancak çoğu zaman kaç elemana ihtiyaç duyacağınızı program çalışana kadar bilemezsiniz.

Dinamik diziler bu sorunu çözer: çalışma zamanında malloc kullanarak işletim sisteminden bir bellek bloğu istersiniz ve boyutu bir değişkenle belirlersiniz.

malloc ile Tanışın

malloc (bellek ayırma), <stdlib.h> içinde bulunur. Ona bayt cinsinden bir sayı verirsiniz; o da bu bloğa yönelik bir işaretçi döndürür veya başarısız olursa NULL döndürür.

Bellek öbekten gelir ve siz serbest bırakana kadar geçerliliğini korur.

int *p = malloc(10 * sizeof(int));

sizeof ile Boyutlandırma

Bayt sayılarını asla sabit olarak yazmayın. Kodunuzun farklı platformlarda da doğru kalması için sizeof kullanın.

n adet tam sayı için yer ayırmak üzere n ile sizeof(int) değerini çarpın. Yaygın bir kullanım şekli, işaretçinin kendi türünü kullanan n * sizeof(*p) ifadesidir.

int *p = malloc(n * sizeof(*p));

Her Zaman NULL Denetimi Yapın

Sistemde yeterli bellek yoksa malloc, NULL döndürür. NULL bir işaretçinin gösterdiği değere erişmek programınızı çökertir.

İşaretçiyi kullanmadan önce sonucu denetleyin. Bu tek alışkanlık, hata ayıklaması zor birçok arızayı önler.

int *p = malloc(n * sizeof(*p));
if (p == NULL) {
    fprintf(stderr, "out of memory\n");
    return 1;
}

Eksiksiz Bir Bellek Ayırma

Burada 5 tam sayı için yer ayıran, bunları dolduran ve yazdıran eksiksiz bir program bulunuyor.

Simetriye dikkat edin: başlangıçta malloc, sonda free.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n = 5;
    int *a = malloc(n * sizeof(*a));
    if (!a) return 1;
    for (int i = 0; i < n; i++) a[i] = i * i;
    for (int i = 0; i < n; i++) printf("%d\n", a[i]);
    free(a);
    return 0;
}

malloc Sıfırlama Yapmaz

malloc ile alınan bellek başlatılmamıştır: daha önce orada bulunan rastgele değerleri taşır.

Yazmadan önce bu belleği okumak öngörülemeyen değerler verir. Her elemanı okumadan önce mutlaka bir değer atayın.

int *a = malloc(3 * sizeof(*a));
/* a[0], a[1], a[2] hold garbage here */
a[0] = 10;

calloc Sizin İçin Sıfırlar

calloc(count, size), size baytlık count adet eleman için yer ayırır ve her baytı sıfıra ayarlar.

Temiz, sıfırlarla doldurulmuş bir dizi istediğinizde bunu kullanın. Ayrıca çarpma işlemindeki taşmaya karşı da koruma sağlar.

int *a = calloc(5, sizeof(*a));
/* every element is now 0 */

calloc Kullanımda

Bu program calloc kullanır ve değiştirmeden önce dizinin sıfırlarla başladığını doğrular.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n = 4;
    int *a = calloc(n, sizeof(*a));
    if (!a) return 1;
    for (int i = 0; i < n; i++) printf("%d\n", a[i]);
    free(a);
    return 0;
}

Bloğu Dizinleme

Öbekteki bir bloğa işaret eden işaretçi, tıpkı bir dizi adı gibi davranır. 0 ile n-1 arasındaki herhangi bir elemanı okumak ve yazmak için a[i] kullanabilirsiniz.

Arka planda a[i], *(a + i) ile aynıdır.

int *a = malloc(3 * sizeof(*a));
a[0] = 1;
*(a + 1) = 2;   /* same as a[1] = 2 */
a[2] = 3;

Sınırları Gözden Kaçırmayın

n eleman ayırırsanız geçerli dizinler 0 ile n-1 arasındadır. a[n] konumuna yazmak tanımsız davranıştır.

C, sınırları sizin için denetlemez; bu nedenle birer-öte hatası belleği sessizce bozabilir.

int *a = malloc(3 * sizeof(*a));
a[2] = 99;   /* OK, last valid index */
/* a[3] = 0;  BUG: out of bounds */

Boyutu Çalışma Zamanında Okuma

Asıl güç şuradadır: boyut girdiden, bir dosyadan veya bir hesaplamadan gelebilir. Aynı kod 2 ya da 2 milyon eleman için yer ayırabilir.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n = 6;            /* could be scanf'd */
    long *a = malloc(n * sizeof(*a));
    if (!a) return 1;
    long sum = 0;
    for (int i = 0; i < n; i++) { a[i] = i + 1; sum += a[i]; }
    printf("%ld\n", sum);
    free(a);
    return 0;
}

Hızlı Kontrol

Bellek ayırma konusundaki anlayışınızı sınayın.

Özet

Dinamik bir diziyi malloc(n * sizeof(*p)) ile ayırabilir veya calloc(n, sizeof(*p)) ile sıfırlarla doldurabilirsiniz.

Her zaman NULL denetimi yapın, malloc'un çöp değerler bıraktığını unutmayın, 0'dan n-1'e kadar dizin kullanın ve her bellek ayırma işlemini bir free ile eşleştirin. Sırada, verilerini koruyarak bir bloğun boyutunu değiştirmeyi öğreneceksiniz.

Sıkça Sorulan Sorular

“Dizi Ayırma” dersi ücretsiz mi?

Evet — “Dizi Ayırma” 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.

“Dizi Ayırma” dersinde ne öğreneceğim?

Yığın belleği ayırı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.

“Dizi Ayırma” 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

  1. Dizi Ayırma
  2. realloc ile Büyütme
  3. Yeniden Kullanılabilir Vektör Türü
  4. Belleği Serbest Bırakma ve Sızıntıları Önleme
← C Academy Sayfasına Dön