如何解决跳过 C 结构中的偏移量
当我写一个结构体时,我希望特定的值会进入特定的偏移量
struct test
{
int dummy1[100];//dummy
int id_s ;
int dummy2[5];//dummy
int id_t;
}
我只想要这个结构的 2 个成员:id_s
和 id_t
,我希望 id_s
的偏移量为 400 (100 * 4) 和 {{1} } 将在 (100 * 4 +4 + 5*4) 的偏移量
有没有什么简单的方法可以代替放置一些虚拟字段?
解决方法
有没有什么简单的方法可以代替放置一些虚拟字段?
作为通用的便携式解决方案:否
C 标准不要求类型 int
为 4 个字节。此外,C 标准允许在结构中进行填充,因此也可能会更改布局。因此,您不能只编写像您这样的结构,并依赖所有系统上的偏移量。
但对于大多数系统,它会按您的预期工作。
不过我会做两个改变。
- 使用
char
表示假人。
喜欢:
struct test
{
char dummy1[400];//dummy
int id_s ;
char dummy2[20];//dummy
int id_t;
};
- 使结构打包。
喜欢:
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 举报,一经查实,本站将立刻删除。