在结构体中转换 void 指针

问题描述 投票:0回答:2

这是我得到的..

typedef struct SysInfo_P
{
    int some_P_int
    char some_P_char[10];
    ...

} SysInfo_P;


typedef struct SysInfo_S
{
    int some_S_int
    char some_S_char[10];
    ...

} SysInfo_S;


typedef struct Device
{
    struct SomeData *data;
    void *sysInfo;
    ...
} Device;

这个想法是有一个基类 Device,并在分配期间将其

void
指针转换为适当的
SysInfo_x
类。我一直使用
void
指针来为常用函数提供多功能性,但我似乎无法理解这一点......也许它无法做到。

这是我徒劳的尝试将其投射到我的分配器中。

self->sysInfo = (SysInfo_S *)malloc(sizeof(*self->properties->sysInfo));
memset(self->sysInfo, 0, sizeof(*self->properties->sysInfo));
c void-pointers
2个回答
2
投票

你想要的是一个

union
:

typedef struct Device
{
    struct SomeData *data;
    union {
        struct SysInfo_S s;
        struct SysInfo_P p;
    } sysInfo;
    ...
} Device;

0
投票

dbush 的答案将会起作用并且可能是理想的。然而,如果你试图用 C 语言模仿 OOP,那么你的情况就有点相反了。通常,基类成为子类的第一个成员。这是因为它是标准的一部分,允许您将结构的地址强制转换为第一个成员类型的指针。所以像这样:


typedef struct Device
{
    struct SomeData *data;
    ...
} Device;

typedef struct SysInfo_P
{
    Device base;
    int some_P_int
    char some_P_char[10];
    ...
} SysInfo_P;


typedef struct SysInfo_S
{
    Device base;
    int some_S_int
    char some_S_char[10];
    ...
} SysInfo_S;

然后,您可以合法地做这样的事情:

SysInfo_P* sysinfo = malloc(sizeof(*sysinfo));
Device* parent = (Device*)sysinfo;
© www.soinside.com 2019 - 2024. All rights reserved.