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

初始字段布局相同的不同结构体,能否安全跨类型访问修改?

结论:该操作符合C标准,是安全合法的

依据C99及后续版本的标准规定:

  • 当两个结构体的初始字段序列类型、顺序和对齐要求完全一致时,将其中一个结构体的指针转换为另一个结构体的指针,仅访问这些公共初始字段的行为,属于定义良好的行为。
  • 标准明确:指向结构体的指针可合法转换为指向其第一个成员的指针;同理,初始字段序列匹配的结构体之间,这种跨类型指针转换后访问公共字段的操作,不会触发未定义行为。

关键注意点

  1. 字段必须严格匹配:除了类型和顺序一致,编译器对字段的填充字节也必须相同——只要字段类型和顺序符合要求,符合标准的编译器会保证初始序列的内存布局一致。
  2. 仅操作公共初始字段:绝对不能通过转换后的指针访问第二个结构体的额外字段,这属于未定义行为,可能导致程序崩溃或逻辑异常。
  3. 可读性优先:这种写法虽然合法,但会降低代码的可维护性,后续开发者容易误解代码意图。更推荐的做法是提取公共字段为独立结构体,再嵌入到两个结构体中:
struct CommonFields {
  int num;
  char *str;
  int *lst;
  unsigned int num_lst;
};

struct Athis {
  struct CommonFields common;
  // Athis专属字段
};

struct Bthat {
  struct CommonFields common;
  char *b_not_b;
  bool b_hamlet; 
  long guildenst; 
  unsigned long rosencr;
};

通过b.common.num的方式访问公共字段,代码意图更清晰,也更符合编码规范。


内容的提问来源于stack exchange,提问作者Marco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 15:03:14