Resmi ya da başka birinin ne söylediğine bakılmaksızın tanımsız bir davranış değildir , çünkü standart tarafından tanımlanmıştır. p->s
, bir değer olarak kullanılması dışında, özdeş bir gösterici olarak değerlendirilir (char *)p + offsetof(struct T, s)
. Özellikle, bu, char
malloc'lu nesnenin içinde geçerli bir göstericidir ve hemen ardından char
, tahsis edilen nesnenin içindeki nesneler olarak da geçerli olan 100 (veya daha fazla, hizalama hususlarına bağlı olarak) ardışık adres vardır . İmlecin, ->
döndürme tarafından döndürülen işaretçiye açıkça eklemek yerine kullanılarak türetilmiş olması malloc
, çevirme ile char *
, alakasızdır.
Teknik olarak, yapı içindeki dizinin p->s[0]
tek öğesidir char
, sonraki birkaç öğe (örneğin p->s[1]
aracılığıyla p->s[3]
) muhtemelen yapı içindeki doldurma baytlarıdır; bu, yapıya bir bütün olarak atama gerçekleştirirseniz bozulabilir, ancak yalnızca bireye erişirseniz değil üyeler ve diğer öğeler, tahsis edilen nesnede, hizalama gereksinimlerine uyduğunuz sürece (ve char
hizalama gereksinimleri olmadığı sürece) istediğiniz gibi kullanmakta serbest olduğunuz ek alandır .
Eğer dolgu ile örtüşen olasılığı her nasılsa burun iblisler çağırmak, sen değiştirerek bu önlemek olabilir belki yapı içinde bayt endişe varsa 1
içinde [1]
yapı sonunda hiçbir doldurma halde kalmasını sağlayan bir değere sahip. Bunu yapmanın basit ama savurgan bir yolu, sonunda hiçbir dizi dışında aynı üyelere sahip bir yapı s[sizeof struct that_other_struct];
oluşturmak ve dizi için kullanmak olacaktır. Daha sonra, p->s[i]
yapıdaki dizinin bir öğesi ve için yapının i<sizeof struct that_other_struct
sonunu izleyen bir adreste bir char nesnesi olarak açıkça tanımlanır i>=sizeof struct that_other_struct
.
Düzenleme: Aslında, doğru boyutu elde etmek için yukarıdaki numarada, dizinin kendisinin başka bir öğenin dolgusunun ortasından ziyade maksimum hizalamayla başlamasını sağlamak için diziden önce her basit türü içeren bir birleşim koymanız gerekebilir. . Yine, bunların hiçbirinin gerekli olduğuna inanmıyorum, ama bunu en paranoyak dil avukatları için öneriyorum.
Düzenleme 2: Standardın başka bir parçası nedeniyle dolgu baytlarıyla örtüşme kesinlikle sorun teşkil etmez. C, eğer iki yapı, elemanlarının bir ilk alt dizisinde uyuşursa, ortak ilk elemanlara herhangi bir tip için bir gösterici aracılığıyla erişilebilmesini gerektirir. Özdeş bir yapı, eğer bir sonucu olarak, struct T
ancak daha büyük bir nihai dizi ile beyan edilmiştir, eleman s[0]
elemanına denk gerekir s[0]
olarak struct T
ve bu ilave elemanların varlığı etkilemez olabilir ya da daha büyük bir yapı ortak elemanları erişmek etkilenebilir bir işaretçi kullanarak struct T
.