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

Sho*_*wav 4 c

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

struct _obj;
typedef _obj obj;

typedef struct{
    int val;
} obj_int;

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

asc*_*ler 6

通常.

标准6.3.2.3/7:

指向对象或不完整类型的指针可以转换为指向不同对象或不完整类型的指针.如果生成的指针未针对指向类型正确对齐,则行为未定义.否则,当再次转换回来时,结果将等于原始指针.当指向对象的指针转换为指向字符类型的指针时,结果指向对象的最低寻址字节.结果的连续增量(直到对象的大小)产生指向对象的剩余字节的指针.

因此,如果o在第一个成员为的任何结构对象上的点int,你就可以了.如果它指向从中获得的内存的开头malloc,那里int已经写了一个表示,你就没事了.但如果它指向一个char[sizeof(int)]或某个这样的东西,你可能会有对齐问题.