Menu
Coddy logo textTech

Derin Kopyalama

Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 15 / 61.

C'de bir yapıyı başka bir yapıya atadığınızda sığ kopya elde edersiniz: tüm alanlar bayt bayt kopyalanır. Bu, tamsayılar gibi basit değerler için sorunsuz çalışır; ancak işaretçilerle ilgili bir sorun oluşturur: her iki yapı da aynı belleği işaret eder.

typedef struct {
    char *name;
    int age;
} Person;

Person alice = {"Alice", 30};
Person copy = alice;  // Sığ kopya!
// Hem alice.name hem de copy.name AYNI string'e işaret eder

Birini serbest bırakırsanız diğeri geçersiz hâle gelir. Dizeyi biri aracılığıyla değiştirirseniz ikisi de değişikliği görür. Genellikle istediğiniz şey bu değildir.

Derin kopya, işaretçi üyeleri için yeni bellek ayırır ve gerçek verileri kopyalar:

Person *clone_person(const Person *original) {
    Person *copy = malloc(sizeof(Person));
    copy->name = malloc(strlen(original->name) + 1);
    strcpy(copy->name, original->name);
    copy->age = original->age;
    return copy;
}

Artık her nesne kendi dizesine sahip. Birini diğerini etkilemeden değiştirebilir veya serbest bırakabilirsin. Örüntü basittir: her işaretçi üyesi için yeni bellek ayır ve yalnızca adresi değil, içeriği kopyala.

challenge icon

Görev

Kolay

Derin kopyalama desenini gösteren bir Student modülü oluşturalım. Bir öğrenci nesnesinin tamamen bağımsız bir kopyasını üreten bir klonlama işlevi oluşturacaksınız: özgün nesneyi değiştirmek veya serbest bırakmak klon üzerinde hiçbir etkiye sahip olmayacak.

Üç dosya oluşturacaksınız:

  • student.h: İki üyeye sahip bir Student yapısı tanımlayın: char *name (dinamik olarak ayrılmış bir dize) ve int grade. Üç işlev tanımlayın:
    • create_student: bir ad ve not alan, yeni bir Student işaretçisi döndüren yapıcı
    • clone_student: bir const Student * alan ve yeni, bağımsız bir kopyaya işaretçi döndüren işlev
    • free_student: ayrılmış tüm belleği düzgün biçimde serbest bırakan yıkıcı
    STUDENT_H sembolüyle include guard kullanın.
  • student.c: Üç işlevin tümünü uygulayın. clone_student işleviniz temel noktadır. Hem yapı hem de ad dizesi için yeni bellek ayırmalı, ardından gerçek dize verilerini (yalnızca işaretçi adresini değil) kopyalamalıdır. Bu, klonun özgün nesneden tamamen ayrı olan kendi belleğine sahip olmasını sağlar.
  • main.c: Bir öğrenci oluşturun, onu klonlayın, her iki öğrencinin bilgilerini görüntüleyin ve ardından her iki nesneyi de düzgün biçimde temizleyin.

İki girdi alacaksınız: öğrenci adı (bir dize) ve not (bir tam sayı).

Ana dosyanızda, sağlanan değerlerle bir öğrenci oluşturun, ardından bu öğrencinin bir klonunu oluşturun. Aynı verileri içerdiklerini doğrulamak için hem özgün öğrencinin hem de klonun bilgilerini yazdırın. Son olarak her iki öğrenciyi de serbest bırakın ve bir onay iletisi yazdırın.

Çıktıyı şu biçimde yazdırın:

Original: {name}, Grade: {grade}
Clone: {name}, Grade: {grade}
Both freed

Örneğin, girdiler Alice ve 95 olduğunda çıktı şöyle olur:

Original: Alice, Grade: 95
Clone: Alice, Grade: 95
Both freed

Derin kopyalama deseni, her nesnenin gerçekten bağımsız olmasını sağlar: klon, özgün nesnenin belleğine paylaşılan bir işaretçi yerine kendi ayrılmış dizesine sahiptir.

Kendin dene

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

int main() {
    char name[100];
    int grade;
    
    // Girdiyi oku
    scanf("%s", name);
    scanf("%d", &grade);
    
    // TODO: Sağlanan ad ve not ile bir öğrenci oluştur
    
    // TODO: Öğrencinin bir klonunu oluştur
    
    // TODO: Print the original student's information
    // Biçim: "Original: {name}, Grade: {grade}"
    
    // TODO: Klonun bilgilerini yazdır
    // Biçim: "Clone: {name}, Grade: {grade}"
    
    // TODO: Her iki öğrenciyi de serbest bırak
    
    // Onayı yazdır
    printf("Both freed\n");
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi