代码之家  ›  专栏  ›  技术社区  ›  Ta Thanh Dinh

结构和结构的第一个成员之间的指针别名

  •  1
  • Ta Thanh Dinh  · 技术社区  · 5 年前

    C中的指针别名通常是未定义的行为(因为有严格的别名),但C11标准似乎允许对指向结构的指针和指向结构的第一个成员的指针进行别名

    C11 6.7.2.1(15)…指向结构对象的指针。。。指向其初始成员。。。反之亦然。。。

    下面的代码是否包含未定义的行为

    struct Foo {
        int x;
        int y;
    };
    
    // does foe return always 100?
    int foe() {
        struct Foo foo = { .x = 10, .y = 20 }, *pfoo = &foo;
        int *px = (int*)pfoo;
        *px = 100;
        return pfoo->x;
    }
    
    
    1 回复  |  直到 5 年前
        1
  •  3
  •   M.M    5 年前

    此代码正确。标准C和C++的所有版本都允许这样做,尽管措辞有所不同。

    没有严格的别名问题,因为您访问的对象类型为 int 通过类型的左值 内景 . 当执行访问的左值对存储在内存位置的对象具有不同类型时,可能会应用严格的别名规则。

    内景