将结构体转换为整数是否合法?相关代码是否存在未定义行为?
问题:这段C代码是否合法且无未定义行为?
示例代码
struct test{ int num; }; int main(){ struct test t = {1234}; int n = *((int*)&t); // n = 1234 return 0; }
问题描述
上述代码写法是否合法且不存在未定义行为?我在生产环境的V8源码中见过类似实现。注:请忽略此处使用的C风格强制转换。
回答
这段代码是合法且无未定义行为的,依据C标准可以从两点解释:
结构体的地址与它的第一个成员地址完全一致
C标准明确规定,结构体对象的起始地址等于其第一个成员的起始地址——结构体的内存布局中,不会在第一个成员之前添加填充字节。所以&t的地址和&t.num的地址完全相同。指针转换与解引用的合法性
把struct test*转换为int*后解引用,本质是访问结构体的第一个int成员。由于int的对齐要求不会高于包含int作为首成员的结构体的对齐要求,且实际访问的对象就是int类型,这种转换和解引用完全符合C标准的规则,不会触发未定义行为。
V8这类底层源码里常用这种写法,本质是利用结构体首成员的地址特性,直接通过结构体地址访问首成员,属于标准允许的操作,在性能敏感场景中很常见。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

