C, aynı türdeki bir yapının diğerine doğrudan atanmasını destekler: tüm alanlar byte byte kopyalanır (memcpy). Bu, yapıların hızlı bir şekilde kopyalanması için uygundur, örneğin:
struct Point { int x, y; }; struct Point p1 = {10, 20}; struct Point p2; p2 = p1; // Artık p2.x=10, p2.y=20
Özellikler:
"Eğer yapı dinamik olarak ayrılmış bir hafıza işaretçisine sahipse ve bir yapıyı diğerine atarsanız ne olur?"
Birçok kişi tüm içeriğin kopyalanacağını düşünür, ama durum böyle değildir.
Cevap: Sadece işaretçi değeri (adres) kopyalanır, bu adresin içindeki veriler değil. Her iki yapı nesnesi de aynı hafızayı gösterecektir.
struct Data { int *arr; }; struct Data d1; d1.arr = malloc(10 * sizeof(int)); struct Data d2 = d1; // d2.arr == d1.arr
d2.arr'yi değiştirirken, d1.arr'nin gördüğü hafızayı değiştirirsiniz.
Hikaye 1
Veri serileştirme: iç işaretçi (malloc) ile bir yapıyı atamıştık - kopyalamadan sonra iki farklı nesne aynı hafızayı gösteriyordu ve serbest bıraktıklarında her iki nesne de free() çağırıyordu. Sonuç - double free ve servis çökmesi.
Hikaye 2
Karmaşık bir yapıyı klonlamaya çalışırken işaretçi alanlarında derin kopyalama yapmayı unuttum. Kopyayı değiştirdikten sonra bağımsızlık bekledim, ama orijinal nesneyi (ve tersini) değiştirerek veri tutarlılığını kaybettim.
Hikaye 3
İç içe bir dize işaretçisi içeren bir yapıyı sakladık. Yapıyı atadıktan sonra dize hafızalarından birini serbest bıraktık ve diğer yapı birden "bozuldu" (dangling pointer), program beklenmedik şekilde davranmaya başladı.