这种“类型狡猾”是否定义明确?

时间:2013-08-26 00:17:36

标签: c

我想知道,是否指向一个不完整类型的未定义行为?

struct _obj;
typedef _obj obj;

typedef struct{
    int val;
} obj_int;

void print_stuff(obj* o){
    printf("%d\n", ((*obj_int)(o)) -> val);
}

2 个答案:

答案 0 :(得分:6)

一般

标准6.3.2.3/7:

  

指向对象或不完整类型的指针可能会转换为指向其他对象的指针   对象或不完整的类型。如果生成的指针未正确对齐   指向类型,行为未定义。否则,当再次转换回来时,   结果应比较等于原始指针。当指向对象的指针是   转换为指向字符类型的指针,结果指向最低寻址字节   物体。结果的连续增量,直到对象的大小,产生指针   到对象的剩余字节。

因此,如果o指向任何第一个成员为int的结构对象,那么你没问题。如果它指向从malloc获得的内存的开头,那里写了int的表示,那你就没事了。但如果它指向char[sizeof(int)]或某些此类事物,则可能存在对齐问题。

答案 1 :(得分:1)

您没有提供足够的信息来回答您的问题。 如果您将obj_int*投射到obj*,然后将其传递给print_stuff然后您的代码根据C标准是合法的因为你被允许将指针转换为另一个指针类型并返回。但是,如果print_stuff的参数是以任何其他方式获得的,那么您就有未定义的行为。