gpt4 book ai didi

c - 确定结构大小,忽略填充

转载 作者:行者123 更新时间:2023-11-30 18:49:26 26 4
gpt4 key购买 nike

我通过网络接收数据报,我想将数据复制到具有适当字段的结构(对应于消息的格式)。有许多不同类型的数据报(具有不同的字段和大小)。这是一个简化版本(实际上字段始终是字符数组):

struct dg_a
{
char id[2];
char time[4];
char flags;

char end;
};

struct dg_a data;
memcpy(&data, buffer, offsetof(struct dg_a, end));

目前,我在结构体末尾添加了一个名为 end 的虚拟字段,以便我可以使用 offsetof 来确定要复制的字节数。

是否有更好且不易出错的方法来做到这一点?我一直在寻找比放置 __attribute__((packed)) 和使用 sizeof 更便携的东西。

--

编辑

评论中的一些人表示我的方法很糟糕,但到目前为止没有人提出原因。由于结构成员是 char,因此成员之间没有陷阱表示和填充(由标准保证)。

最佳答案

一个核心问题是缓冲区的大小(假设是字符数组)。下面的 2 个副本,可能有几个字节的差异。

memcpy(&data, buffer, offsetof(struct dg_a, end));  // 7 
// or
memcpy(&data, buffer, sizeof data); // 7, 8, 16 depends on alignment.

考虑避免这些问题,并使用与任何数据结构一样宽的缓冲区,并在填充传入数据之前进行零填充/填充。

struct dg_a {
char id[2];
char time[4];
char flags;
}; // no end field

union dg_all {
struct dg_a a;
struct dg_b b;
...
struct dg_z z;
} buffer = { 0 };

foo(&buffer, sizeof buffer); // get data

switch (bar(buffer)) {
case `a` {
struct dg_a data = buffer.a; // Ditch the memcpy
// or maybe no need for copy, just use `buffer.a`

关于c - 确定结构大小,忽略填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42786794/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com