Значение унарного `&` применяется к члену профсоюза
Обычно в С, используя одинарный &
Оператор в lvalue дает указатель, так что в любое время в течение времени жизни базового объекта, применяя унарный *
указатель выдаст lvalue, эквивалентный оригиналу. Такое поведение по сути является смыслом &
оператор.
В gcc, однако, указатель получен путем применения &
член профсоюза не может быть использован в течение какого-либо заметного периода времени. Например, учитывая:
struct s1 {int x;};
struct s2 {int x;};
union u {struct s1 v1; struct s2 v2;};
int test(union u *u1, union u *u2)
{
struct s1 *p1 = &u1->v1;
if (p1->x)
{
struct s2 *p2 = &u2->v2;
p2->x = 5;
}
p1 = &u1->v1;
return p1->x;
}
int test2(void)
{
struct s2 s = {1};
union u u1;
u1.v2 = s;
return test(&u1,&u1);
}
gcc сгенерирует код для test1, который возвращает 1, а не 5, если не используется -fno-strict-aliasing. Обратите внимание, что p1->v1.x
а также p2->v2.x
оба являются частью одной и той же общей начальной последовательности, полное определение объединения видно везде, где к ним осуществляется доступ, и lvalue p1->v1
используется между записью p2->v2.x
и последующее чтение ("осмотр") p1->v1.xp
, Если применение оператора address-of к члену объединения не гарантирует получение указателя, который можно использовать для проверки идентифицированного им lvalue, что означает этот оператор?