微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

跳过 C 结构中的偏移量

如何解决跳过 C 结构中的偏移量

当我写一个结构体时,我希望特定的值会进入特定的偏移量

struct test

{
   int dummy1[100];//dummy
   int id_s ;
   int dummy2[5];//dummy
   int id_t;

}

我只想要这个结构的 2 个成员:id_sid_t,我希望 id_s 的偏移量为 400 (100 * 4) 和 {{1} } 将在 (100 * 4 +4 + 5*4) 的偏移量

有没有什么简单的方法可以代替放置一些虚拟字段?

解决方法

有没有什么简单的方法可以代替放置一些虚拟字段?

作为通用的便携式解决方案:否

C 标准不要求类型 int 为 4 个字节。此外,C 标准允许在结构中进行填充,因此也可能会更改布局。因此,您不能只编写像您这样的结构,并依赖所有系统上的偏移量。

但对于大多数系统,它会按您的预期工作。

不过我会做两个改变。

  1. 使用 char 表示假人。

喜欢:

struct test
{
   char dummy1[400];//dummy
   int id_s ;
   char dummy2[20];//dummy
   int id_t;

};
  1. 使结构打包。

喜欢:

struct test
{
   char dummy1[400];//dummy
   int id_s ;
   char dummy2[20];//dummy
   int id_t;

} __attribute__((__packed__));

由于您不能 100% 确定它是否有效,我还会添加断言(静态)以验证布局是否符合预期。

喜欢:

_Static_assert(offsetof(struct test,id_s) == 400,"Illegal offset for id_s in struct test");
_Static_assert(offsetof(struct test,id_t) == 424,"Illegal offset for id_t in struct test");

要考虑整数大小并仍然获得偏移量 400 和 424,您可以这样做:

struct test
{
   char dummy1[400];//dummy
   int id_s ;
   char dummy2[24 - sizeof(int)];//dummy
   int id_t;

} __attribute__((__packed__));
,

有没有什么简单的方法可以代替放置一些虚拟字段?

编写自己的访问器。

我只想要这个结构体的 2 个成员: id_s 和 id_t ,我希望 id_s 的偏移量为 400 (100 * 4) 并且 id_t 的偏移量为 (100 * 4 +4 + 5*4) )

自己将它们放在特定的字节偏移处:

#define TEST_ID_S_OFFSET  (100*4)
// 100*4 +4 ? Why +4?
#define TEST_ID_T_OFFSET  (TEST_ID_S_OFFSET + sizeof(int) + 5*4)
struct test {
   char data[TEST_ID_T_OFFSET + sizeof(int)];
};

int test_get_id_s(struct test *t) {
      int ret;
      memcpy(&ret,&t->data[TEST_ID_S_OFFSET],sizeof(ret));
      return ret;
}
void test_set_id_s(struct test *t,int val) {
      memcpy(&t->data[TEST_ID_S_OFFSET],&val,sizeof(val));
}
int test_get_id_t(struct test *t) {
      int ret;
      memcpy(&ret,&t->data[TEST_ID_T_OFFSET],int val) {
      memcpy(&t->data[TEST_ID_T_OFFSET],sizeof(val));
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。