Eksik bir türün işaretçisi eksik olabilir mi?


9

Can int (*)[]tamamlanmamış bir tür olabilir mi?

C 2018 6.2.5 1 diyor ki:

Bir çeviri birimindeki çeşitli noktalarda bir nesne türü eksik (o türdeki nesnelerin boyutunu belirlemek için yeterli bilgiye sahip olmayabilir ) veya tam (yeterli bilgiye sahip) olabilir.

Dolayısıyla, bir türün boyutu biliniyorsa, türün tamamlanmış olduğu görülmektedir. 6.2.6.1 28, belirli işaretçi türlerinin aynı boyutlara sahip olması gerektiğini belirtir (işaretçiler voidve karakterler, uyumlu türlere işaretçiler, yapılara işaretçiler ve sendikalara işaretçiler), ancak diğer türlere işaretçiler değişebilir.

Tüm işaretçilerin veya dizilerin tüm işaretleyicilerinin intaynı boyuta sahip olduğu bir C uygulamasında , o zaman boyutu int (*)[]bilinir, bu yüzden tam olur. Örneğin, büyük diziler için farklı işaretçiler kullanan bir uygulamada, boyut bilinmeyecektir, bu nedenle eksiktir.

Olarak AA işaret , bir yapı 6.7.2.1 Bu işaretçiler bir boyutu olan bir uygulama kabul etmesi gerektiğini göstermektedir 3'te bir kısıtlama başına, nihai esnek dizi elemanı hariç, tam olmayan tip bir üye içermemelidir struct { int (*p)[]; }bir uygulama farklı olduğu da bu tür diziler için boyutlar bir kısıtlama ihlali teşhisi koymalıdır. (Bu da böyle bir bildirimin kesinlikle C'ye uygun olmadığı anlamına gelir.)


6.2.5 (p22) yardım? (veya eksik türün daha sonraki bildirimle tamamlanmasına izin veren daha fazla karışıklık ekler mi?)
David C. Rankin

@ DavidC.Rankin 6.2.5 / 20'de işaretçilerin her zaman eksiksiz tipler olduğu bile söylenir
Christophe

@LanguageLawyer: Bu nasıl alakalı olurdu? Soru “Y olmayan bir X var mı?” Değil, “Y olan bir X var mı?” Değil.
Eric Postpischil

@LanguageLawyer: void *Tamamlanmış olan gerçek, eksik bir türün göstergesinin tamamlanabileceğini gösterir. Eksik bir türün göstergesinin eksik olup olmadığını göstermez. Eğer biri “Bir memeli fil olabilir mi?” Diye sorduysa, “Aslan bir memelidir” diyerek, bir memelinin fil olamayacağını temin etmez. Soru, eksik tipe işaretçi kümesinin X kümesinin eksik bir eleman içerip içermeyeceğini sorar. Eksik tipe işaretçi kümesinin X'in tamamlanmış bir eleman içerdiğini göstermek ilgisizdir.
Eric Postpischil

@EricPostpischil Hata. Başlığı "Tamamlanmamış bir tür işaretçi tamamlanabilir mi?"
Dil Avukatı

Yanıtlar:


3

Boyutu bilinmeyen bir dizi eksik:

Boyutu bilinmeyen bir dizi türü eksik bir türdür. Bu tür bir tanımlayıcı için, daha sonraki bir bildirimde (iç veya dış bağlantı ile) boyut belirtilerek tamamlanır.

Ancak tür int (*)[]eksik değil: intBilinmeyen boyutta bir dizinin işaretçisi .
Ve bir işaretçi iyi bilinen bir boyuta sahiptir:

printf ("Size %d\n", sizeof(int (*)[]));

6.2.5 / 23: Tür eksik değilse ve değişken uzunluklu bir dizi türü değilse, bir türün sabit boyutu bilinmektedir.

Dahası, dizi semantiği sayesinde bunu bile kaldırabilirsiniz:

typedef int (*T)[];
...
int a[10];
for (int i=0; i<10; i++) a[i]=i;
T p=a;
for (int i=0; i<10; i++) printf ("%d ",(*p)[i]);
printf ("\n");

Düzenle

Ayrıca, bir işaretçi her zaman tam bir türdür. 6.2.5 / 20'de beyaz üzerine siyah yazılmıştır:

İşaretçi türü, başvurulan tür adı verilen bir işlev türünden veya nesne türünden türetilebilir. İşaretçi türü, değeri başvurulan türdeki bir varlığa başvuru sağlayan bir nesneyi tanımlar. Referans verilen T türünden türetilen bir işaretçi türüne bazen '' işaretçi T'ye '' denir. Başvuru yapılan bir türden bir işaretçi türünün oluşturulmasına `` işaretçi tür türevi '' denir. İşaretçi türü, tam bir nesne türüdür.


Sanırım onu ​​kaynattın ve gcc kabul etti. tamamlanmamış diziye işaretçi yapı , tartışmayı başlatan orijinal soruya benzer.
David C. Rankin

Yalnızca son paragraf önemlidir. Örnek, printfyalnızca, tamamlanmayan bir diziye yönelik bir işaretçinin, yürütüldüğü uygulamada, soruda belirtildiği gibi tamamlandığını gösterir - son paragrafta belirtilen 6.2.5 20 için değilse, derlenemeyebilir. 6.2.5 23 de ilgili değildir; bize boyutun tamamlandığını ve tamamlandığını sabit olduğunu söyler ve zaten tam olmanın boyutun bilindiği anlamına geldiğini biliyoruz.
Eric Postpischil

6.2.5 20 ilginçtir. Bu sonuca varmak için tasarlanmadığını tahmin ediyorum, ancak bu, eksik olduğunda aynı tipte olan türlerin tamamlanması için tüm işaretçilerin aynı boyutta olması gerektiği anlamına gelir. Örneğin, dizilerin tüm işaretçileri intbirbiriyle aynı boyutta olmalı ve belirli bir dizinin tüm işaretçileri structbirbiriyle aynı boyutta olmalıdır, ancak belki de farklı türde dizilerin tüm işaretçileri structaynı boyutta olmamalıdır. birbirleri gibi.
Eric Postpischil

1
@EricPostpischil "Benzer şekilde, uyumlu türlerin nitelikli veya niteliksiz sürümlerine işaretçiler aynı temsil ve hizalama gereksinimlerine sahip olacaktır." uyumlu türler oldukları ve niteleyiciler ekleyebileceğimiz veya kaldırabileceğimiz T(*)[]için aynı boyutta olması gerektiği şeklinde yorumlanmalıdırT(*)[5]
MM

Uyumlu türlerin farklı boyutlara sahip olmasına izin vermek bir dizi soruna yol açacaktır, muhtemelen standardın açıkça dışlamaması bir kusurdur
MM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.