Aşağıdaki kod, tanımlanmamış davranışları (takma ihlalden dolayı veya başka bir nedenle) çağırıyor mu? a
ve b
aynı tür işaretçiler olabilir ve böylece takma birbirine izin çünkü düz int *
yerine işaretçi-dizi tipleri kullanılarak karşılık gelen kod, mükemmel yasal olacağınıDizi işaretçisi takma adı - tanımsız davranış?
int foo(int (*a)[10], int (*b)[5])
{
(*a)[5]++;
return (*b)[0];
}
int x[10];
foo(&x, (int (*)[5])&x[5]);
not edin.
Düzenleme: Bu aslında bir örtüşme ihlal edip ilginç sonucu, restrict
anlambilimini öncesi C99 almak için hackish ama geçerli bir yol gibi görünüyor olmasıdır. olduğu gibi: Her adreste, gerçek bir dizi erişmek için gerekli Muhtemelen eğer
void some_func(int *aa, int *bb)
{
int (*a)[1] = (void *)aa;
int (*b)[2] = (void *)bb;
/* Now **a and **b can be assumed by the compiler not to alias */
}
, sen farklı boyutları gibi SIZE_MAX-1 ve SIZE_MAX-2 vb kullanabilirsiniz.
Aynı türden işaretçilerdir, takma adlara ait değiller. –