gpt4 book ai didi

c - 使用 UNION 和 STRUCTURE

转载 作者:太空宇宙 更新时间:2023-11-04 08:39:37 25 4
gpt4 key购买 nike

这种方法是否正确?

struct netinfo
{
// a lot of members here...
union
{
UINT type;
struct
{
UINT _type; // a place holder (obviously who access this struct already knows the type is ipv4)
UINT32 saddr;
UINT32 daddr;
UINT ttl.
} ip4;
struct
{
UINT _type; // a place holder (obviously who access this struct already knows the type is ipv6)
UINT8 saddr[16];
UINT8 daddr[16];
} ip6;
} protocol;
// a lot of members here...
};

struct netinfo my_netinfo;

my_netinfo.protocol.type = NETTYPE__IPV4; // note that i used the "protocol" union as the "type" member
my_netinfo.protocol.ip4.saddr = addr1; // now i'm accessing the union as the "ip4" member
my_netinfo.protocol.ip4.daddr = addr2;
my_netinfo.protocol.ip4.ttl = 64;

// ...

// later, i pretend to acess protocol.type and protocol.ip4.X, the way i want

请注意,我的意图是同时访问它:

my_netinfo.protocol.type 和my_netinfo.protocol.ip4

我不会使用 my_netinfo.protocol.ip4.type,因为通过访问 my_netinfo.protocol.ip4,我已经知道我正在处理 IPv4。

问题是:

通过在结构中使用 _type 作为其第一个成员,这种方法是否有效且是个好主意?

union { int x; struct { int _padding_for_x; int a; int b; } y };

再这样 union_namex、union_name.y.a、union_namey.y.b、union_name.x...

我可以按任何顺序写/读/写/再读吗?

最佳答案

除了您关于删除冗余 UINT 类型 的问题下方的评论外,为 ip4 和 ip6 使用两个不同的结构比尝试使它们成为 netinfo union 的成员可能更有意义。这就是为什么。虽然 union 不要求成员大小相等,但 union 只会使用足够大的内存来容纳最大的成员大小。请参阅:glibc reference manual这是因为 union 一次只持有一组数据。根据您的问题,这可能行不通:

Note that my intention is access it as, AT THE SAME TIME:

您可以在同一时间同时访问 netinfo.ip4 和 netinfo.ip6,但是除非您的代码对 ip4 和 ip6 都表现正确,而不管在阅读,您的代码将不起作用。回想一下,您可以通过 union 中包含的两种数据类型访问相同 数据,但如果两种类型的数据不同,则不能保证您访问的内容对两种类型都有意义。这就引出了你最后的问题:

Can I write/read/write/read again all of them in any order?

您可以随时写入 union 体,但您只能同时通过两种类型返回有用的数据当且仅当,存储在 union 体中的数据对ip4 和 ip6 同时。鉴于 ip4 和 ip6 成员的存储差异,这不太可能。

所以你可以存储ip4并读回ip4,你可以存储ip6并读回ip6,但是您不能存储 ip4.saddr 然后期望读取 ip6.saddr 没有问题。 union 外的独立结构问题要小得多。

关于c - 使用 UNION 和 STRUCTURE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24348849/

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