我的项目中有许多类型的结构,另一个结构包含指向这些结构之一的指针。如,
struct one{int num = 1;};
struct two{int num = 2;};
struct three{int num = 3;};
// These structs hold many other values as well, but the first value is always `int num`.
Run Code Online (Sandbox Code Playgroud)
我还有另一个结构,其中包含对这些结构的引用。我不得不使用,void*因为我不知道将要引用这些结构中的哪个。
struct Holder{void* any_struct};
Run Code Online (Sandbox Code Playgroud)
我的问题是,我需要这些结构中的值,但是我有一个void指针,能否将第一个变量声明为一个基本结构,将其int强制转换,然后使用它num从这些结构中提取变量,例如:
struct Base{int num};
((Base*) Holder->any_struct)->num
// Gives 1, 2 or 3
Run Code Online (Sandbox Code Playgroud)
如果您唯一需要的是提取num,则可以使用memcpy. 假设它始终int始终是第一个并且始终存在。
int num = 0;
memcpy(&num, Holder->any_struct, sizeof(int));
// Gives 1, 2 or 3 in num.
Run Code Online (Sandbox Code Playgroud)
C99 标准第 6.7.2.1 节第 13 点:
指向结构对象的指针经过适当转换后,指向其初始成员。结构对象内可能有未命名的填充,但不是在其开头。
有关该标准的更多信息,请参阅此答案。