ProgramlamaBackend C Geliştiricisi

C dilinde yapı atama işlemi ile ilgili özellikleri açıklayın. Yapılar nasıl kopyalanır, avantajları ve sınırlamaları nelerdir, hangi hatalar mümkündür?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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:

  • Tüm alanlar "as is" (bit bit) kopyalanır.
  • Eğer alanlar işaretçi/dizi ise, yalnızca işaretçinin kendisi kopyalanır, bu adresteki içerik değil (derin kopyalama gerçekleşmez!).
  • Atama yalnızca aynı türdeki yapılar için çalışır.

Gizli Soru

"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.

Bilinçsizlik nedeniyle gerçek hata örnekleri


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ı.