C语言 结构中void* 的变量内存分配

hfyxw5xn  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(326)

我正在尝试为一个具有可变负载功能的结构体分配一些内存。

typedef struct
{
const uint8_t  item_id;
const uint8_t  reserved;  
const uint16_t num_bytes;
void           *data;

} ipc_transport_item_t;

Payload:

typedef struct
{
uint32_t timestamp_value;
} ipc_transport_sync_packet_t;

ipc_transport_item_t *test = (ipc_transport_item_t*)malloc(8);

ipc_transport_sync_packet_t *mypacket = (ipc_transport_sync_packet_t *)(test->data);

这里void data是我想要我的变量有效载荷开始的地方。所以在分配内存的时候,我分配了4个字节的内存(其他字段)加上我的有效载荷是4个字节。所以我总共分配了8个字节。但是当我试图通过将它转换到我的有效载荷结构体来访问数据以在那里输入信息时,我无法做到这一点。我在这里遗漏了什么吗?
我是否应该首先分配ipc_transport_item_t,然后根据负载的用途为数据分配单独的内存?然后将分配的负载指向ipc_transport_item_t。

holgip5t

holgip5t1#

这里您实际需要的是一个 * 灵活的阵列成员 *:

typedef struct
{
    uint8_t  item_id;
    uint8_t  reserved;  
    uint16_t num_bytes;
    uint8_t  data[];
} ipc_transport_item_t;

这允许您为data数组分配任意数量的字节。然后,您将按如下方式分配空间:

ipc_transport_item_t *test = malloc(sizeof(ipc_transport_item_t) + 4);

另请注意,const限定符已从成员中删除,否则您将无法给予它们赋值。

相关问题