在运行时访问任何结构成员

0 c c++ struct pointers data-structures

是否可以在不知道结构或类的成员变量名称的情况下访问其单个成员?我想做一个“offsetof(struct, tyname)”,而不需要对其他内容进行硬编码的结构名称或成员变量名称。谢谢。

Sam*_*war 5

当然。如果您有一个结构体并且知道成员变量的偏移量和类型,则可以使用指针访问它。

struct my_struct {
    int member1;
    char member2;
    short member3;
    char member4;
}

...

struct my_struct obj;
short member3 = *((short*)((char*)&obj + 5));
Run Code Online (Sandbox Code Playgroud)

这将获得 的值,在 x86 计算机上,member3该值是从 开始处算起的 5 个字节。obj但是,您要小心。首先,如果结构发生变化,你的数据将是垃圾。我们在各处进行强制转换,因此您没有类型安全性,并且如果出现问题,编译器也不会警告您。您还需要确保编译器不会打包结构以将变量与字边界对齐,否则偏移量将会改变。

这不是一件令人愉快的事情,如果我是你,我会避免这样做,但是是的,这是可以做到的。

  • 您应该转换为“char*”,而不是“void*”,因为“sizeof(char)==1”。C 标准没有定义“sizeof(void*)”,因此使用“void*”进行指针算术是未定义的行为。作为扩展,gcc 允许您使用“sizeof(void*)==1”来执行此操作,但这样做时会发出警告。 (2认同)
  • @Adam:你的意思是“sizeof(void)”?定义了“sizeof(void*)”,当对“T*”进行算术运算时,会考虑“sizeof(T)”。 (2认同)