C Academy · Ders

memcpy ve memset

Ham bellek işlevleri

4. ders / 413 adım

memcpy ve memset, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 4. 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.

Ham bellek işlevleri

Dize işlevlerinin aksine memcpy ve memset, ham baytlar üzerinde çalışır ve null sonlandırıcıları yok sayar.

Bu işlevler <string.h> içinde bildirilir ve belirttiğiniz bayt sayısı üzerinde işlem yapar; bu da onları her veri türü için genel amaçlı hâle getirir.

#include <stdio.h>
#include <string.h>

int main(void) {
    int src[] = {1, 2, 3};
    int dest[3];
    memcpy(dest, src, sizeof(src));
    printf("%d %d %d\n", dest[0], dest[1], dest[2]);
    return 0;
}

memcpy imzası

void *memcpy(void *dest, const void *src, size_t n);

src içinden tam olarak n baytı dest'e kopyalar ve dest döndürür. Doğru bayt sayısını elde etmek için sizeof kullanın.

#include <stdio.h>
#include <string.h>

int main(void) {
    char src[] = "copy me";
    char dest[16];
    memcpy(dest, src, strlen(src) + 1);
    printf("%s\n", dest);
    return 0;
}

Baytları doğru sayma

Sayı, öğe cinsinden değil bayt cinsindendir. int dizisi için sizeof(int) ile çarpmanız gerekir.

Gerçek bir dizi üzerinde sizeof(array) kullanmak toplam bayt boyutunu otomatik olarak verir.

#include <stdio.h>
#include <string.h>

int main(void) {
    double a[4] = {1.5, 2.5, 3.5, 4.5};
    double b[4];
    memcpy(b, a, 4 * sizeof(double));
    printf("%.1f %.1f\n", b[0], b[3]);
    return 0;
}

Bölgeler çakışmamalıdır

Kaynak ve hedef bölgeler çakışıyorsa memcpy için tanımsız davranış oluşur.

Aralıkların çakışabileceği durumlarda (örneğin tek bir dizi içindeki öğeleri kaydırırken), çakışmayı güvenli biçimde ele alan memmove kullanın.

#include <stdio.h>
#include <string.h>

int main(void) {
    char buf[] = "ABCDEF";
    memmove(buf + 2, buf, 4);
    printf("%s\n", buf);
    return 0;
}

memset imzası

void *memset(void *ptr, int value, size_t n);

ptr konumundaki n baytı value baytıyla doldurur. Değer bir unsigned char olarak yorumlanır; bu nedenle yalnızca en düşük 8 bit önemlidir.

#include <stdio.h>
#include <string.h>

int main(void) {
    char buf[6];
    memset(buf, 'x', 5);
    buf[5] = '\0';
    printf("%s\n", buf);
    return 0;
}

Belleği sıfırlama

memset işlevinin en yaygın kullanımı, kullanmadan önce bir arabelleği veya yapıyı tamamen sıfırlarla temizlemektir.

memset(arr, 0, sizeof(arr)) her baytı 0 yapar; bu, int'ler, kayan noktalı sayılar ve işaretçiler için geçerli bir sıfır değeridir.

#include <stdio.h>
#include <string.h>

int main(void) {
    int counts[5];
    memset(counts, 0, sizeof(counts));
    for (int i = 0; i < 5; i++) printf("%d ", counts[i]);
    printf("\n");
    return 0;
}

memset bayt bayt çalışır

Dikkatli olun: memset her öğeyi değil, her baytı ayarlar. Bir int dizisini 1 değeriyle doldurmak için bunu kullanmak birler üretmez.

Her int'in tüm baytları 0x01 olur ve sonuç 1 değil 0x01010101 olur.

#include <stdio.h>
#include <string.h>

int main(void) {
    int a[2];
    memset(a, 1, sizeof(a));
    printf("%d\n", a[0]);
    return 0;
}

Bir yapıyı temizleme

memset, her alanı elle ayarlamak yerine tek bir çağrıyla bütün bir yapıyı sıfıra başlatmak için kullanışlıdır.

#include <stdio.h>
#include <string.h>

struct Point { int x; int y; int z; };

int main(void) {
    struct Point p;
    memset(&p, 0, sizeof(p));
    printf("%d %d %d\n", p.x, p.y, p.z);
    return 0;
}

Yapıları kopyalama

Bir yapıyı memcpy ile kopyalayabilirsiniz; ancak basit atama (b = a;) genellikle aynı işi daha anlaşılır biçimde yapar.

Türlerin silindiği genel void * işaretçileri üzerinden kopyalama yapılırken memcpy tercih edilir.

#include <stdio.h>
#include <string.h>

struct Rec { int id; char tag; };

int main(void) {
    struct Rec a = {42, 'A'};
    struct Rec b;
    memcpy(&b, &a, sizeof(a));
    printf("%d %c\n", b.id, b.tag);
    return 0;
}

memcmp: belleği karşılaştırma

İlişkili bir işlev olan memcmp(a, b, n), n ham baytı karşılaştırır ve eşleşmeleri durumunda 0 döndürür.

strcmp'den farklı olarak null sonlandırıcıda durmaz; bu nedenle her türlü ikili veri üzerinde çalışır.

#include <stdio.h>
#include <string.h>

int main(void) {
    int a[] = {1, 2, 3};
    int b[] = {1, 2, 3};
    if (memcmp(a, b, sizeof(a)) == 0)
        printf("Arrays have identical bytes\n");
    return 0;
}

Bunlar neden hızlıdır

memcpy ve memset genellikle tek komutta çok sayıda bayt taşımak için assembly dilinde elle optimize edilir.

Genellikle elle yazılmış bir bayt döngüsünden çok daha hızlıdırlar; bu nedenle toplu veri taşıma ve başlatma işlemlerinde onları tercih edin.

#include <stdio.h>
#include <string.h>

int main(void) {
    char big[1000];
    memset(big, 0, sizeof(big));
    printf("Cleared %lu bytes\n", sizeof(big));
    return 0;
}

Kısa kontrol

memset işlevinin bayt düzeyindeki davranışı konusundaki anlayışınızı sınayın.

Özet

Ham bellek işlevlerini öğrendiniz:

  • memcpy, n bayt kopyalar; bölgeler çakışmamalıdır (çakışma ihtimali varsa memmove kullanın).
  • memset, n baytı tek bir bayt değeriyle doldurur; sıfırlama için idealdir.
  • Sayımlar bayt cinsindendir — sizeof kullanın ve bayt ile öğe arasındaki farktan kaynaklanan tuzaklara dikkat edin.
  • memcmp, '\0' karakterinde durmadan ham baytları karşılaştırır.
Başlamak ücretsiz

Yapay zeka eğitmeniyle C öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
39
Dersler
144

Sıkça Sorulan Sorular

“memcpy ve memset” dersi ücretsiz mi?

Evet — “memcpy ve memset” 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.

“memcpy ve memset” dersinde ne öğreneceğim?

Ham bellek işlevleri 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 4. dersidir.

“memcpy ve memset” 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. strlen, strcpy, strcat
  2. strcmp ve Karşılaştırma
  3. strtok ve Belirteçlere Ayırma
  4. memcpy ve memset
← C Academy Sayfasına Dön