我想知道,是否指向一个不完整类型的未定义行为?
struct _obj;
typedef _obj obj;
typedef struct{
int val;
} obj_int;
void print_stuff(obj* o){
printf("%d\n", ((*obj_int)(o)) -> val);
}
答案 0 :(得分:6)
一般
标准6.3.2.3/7:
指向对象或不完整类型的指针可能会转换为指向其他对象的指针 对象或不完整的类型。如果生成的指针未正确对齐 指向类型,行为未定义。否则,当再次转换回来时, 结果应比较等于原始指针。当指向对象的指针是 转换为指向字符类型的指针,结果指向最低寻址字节 物体。结果的连续增量,直到对象的大小,产生指针 到对象的剩余字节。
因此,如果o
指向任何第一个成员为int
的结构对象,那么你没问题。如果它指向从malloc
获得的内存的开头,那里写了int
的表示,那你就没事了。但如果它指向char[sizeof(int)]
或某些此类事物,则可能存在对齐问题。
答案 1 :(得分:1)
您没有提供足够的信息来回答您的问题。 如果您将obj_int*
投射到obj*
,然后将其传递给print_stuff
,然后您的代码根据C标准是合法的因为你被允许将指针转换为另一个指针类型并返回。但是,如果print_stuff
的参数是以任何其他方式获得的,那么您就有未定义的行为。