相关疑难解决方法(0)

嵌套结构和c中的严格别名

请考虑以下代码:

typedef struct {
  int type;
} object_t;

typedef struct {
  object_t object;
  int age;
} person_t;

int age(object_t *object) {
  if (object->type == PERSON) {
    return ((person_t *)object)->age;
  } else {
    return 0;
  }
}
Run Code Online (Sandbox Code Playgroud)

这是合法代码还是违反了C99严格别名规则?请解释为何合法/非法.

c pointer-aliasing

17
推荐指数
1
解决办法
1732
查看次数

严格的别名和覆盖继承

考虑以下代码示例:

#include <stdio.h>

typedef struct A A;

struct A {
   int x;
   int y;
};

typedef struct B B;

struct B {
   int x;
   int y;
   int z;
};

int main()
{
    B b = {1,2,3};
    A *ap = (A*)&b;

    *ap = (A){100,200};      //a clear http://port70.net/~nsz/c/c11/n1570.html#6.5p7 violation

    ap->x = 10;  ap->y = 20; //lvalues of types int and int at the right addrresses, ergo correct ?

    printf("%d %d %d\n", b.x, b.y, b.z);
}
Run Code Online (Sandbox Code Playgroud)

我曾经认为像将B*转换为A*并使用A*来操纵B*对象这样的事情是严格的别名违规.但后来我意识到标准真的只需要:

对象的存储值只能由具有以下类型之一的左值表达式访问:1)与对象的有效类型兼容的类型,(...)

和表达式ap->x如果有正确的类型和地址,ap那里的类型应该不重要(或者它是什么?).在我看来,这意味着只要子结构不作为一个整体被操纵,这种类型的重叠继承就是正确的. …

c struct strict-aliasing language-lawyer

9
推荐指数
1
解决办法
300
查看次数