【问题标题】:Find offset in struct [duplicate]在结构中查找偏移量[重复]
【发布时间】:2020-10-13 18:54:02
【问题描述】:

我在 c 中有结构

struct Book {
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};

struct Book * book;

我可以像book->book_id一样访问整数book_id

但是我怎样才能通过偏移量访问 book_id 呢?如何计算(在 c 代码中)结构中特定元素的偏移量并像 book+X 一样访问

【问题讨论】:

  • 首先“我可以像 book->book_id 一样访问 book_id”。不,你不能,因为book 不是指针。至于“像书+X一样访问”......你不能。反正不是直接的。您可以获取成员的 byte 偏移量,但要获取指向该成员的指针,您需要指向结构的第一个 byte 的指针。而且您必须知道每个成员的确切类型。
  • 更重要的是,您要解决的实际问题是什么? 为什么需要通过offsets来访问成员?现在你的问题是XY problem。请询问您尝试解决的实际问题,并添加有关此问题的注释作为可能的解决方案。然后,我们可以更好地帮助您,并可能通过为您提供更好的解决原始问题的方法。 或者如果只是好奇,那也没关系。但是请edit您的问题说明这一点。

标签: c struct


【解决方案1】:
#define offset(type, member)  ((size_t)&(((type *)0) -> member))
#define ACCESS(object, type, offset)  (type *)(((char *)&(object)) + (offset))

typedef struct
{
    int a,b,c;
}t;

int main(void)
{
    t s = {1,2,3};
    printf("%zu\n", offset(t,b));
    printf("%d\n", *ACCESS(s, int, offset(t,b)));
}

【讨论】:

  • 为什么在 main 的右括号后面加上 #define offset(type, member)?
  • 复制粘贴错误
  • 为什么不改用the standard offsetof macro
  • 只是想展示它是如何工作的 - 请参阅我的评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 2020-06-11
相关资源
最近更新 更多