You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将结构体转换为整数是否合法?相关代码是否存在未定义行为?

问题:这段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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:22:35