Значение унарного `&` применяется к члену профсоюза

Обычно в С, используя одинарный & Оператор в 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, что означает этот оператор?

0 ответов

Другие вопросы по тегам