gpt4 book ai didi

c - 看不懂struct Barnyard2的sf_ip头文件

转载 作者:行者123 更新时间:2023-12-02 00:11:08 25 4
gpt4 key购买 nike

我正在查看 Barnyard2 的 sf_ip.h source code .我不理解 sfip_t 结构,尤其是 union block 。

typedef struct _ip {
int family;
int bits;

/* see sfip_size(): these address bytes
* must be the last field in this struct */
union
{
u_int8_t u6_addr8[16];
u_int16_t u6_addr16[8];
u_int32_t u6_addr32[4];
// u_int64_t u6_addr64[2];
} ip;
#define ip8 ip.u6_addr8
#define ip16 ip.u6_addr16
#define ip32 ip.u6_addr32
// #define ip64 ip.u6_addr64
} sfip_t;

为什么要用数组?我试图寻找文档,但谷歌一直没有运气。谁能解释一下这里正在做什么?

最佳答案

C 中的 union 为其所有元素使用相同 内存块。这与结构不同,后者的元素在内存中是连续的。

所以,虽然 struct {int x;如果您的变量从内存位置 0x40000000 开始,则 int y;} 将这样布局:

           +-------------+
0x40000000 | x (4 bytes) |
+-------------+
0x40000004 | y (4 bytes) |
+-------------+

一个相关的 union {int x; int y;} 是这样存在的:

Address
+-------------+-------------+
0x40000000 | x (4 bytes) | y (4 bytes) |
+-------------+-------------+

换句话说,它一次只能用于一个,从技术上讲,当您上次使用x 时使用y 是未定义的行为 来设置变量 - 虽然在这种情况下,您很可能会发现它会起作用,因为这两种可能性是同一类型。

在您的特定情况下,您具有以下内存布局(假设您的变量位于 0x40000000):

           +--------------+--------------+--------------+
0x40000000 | u6_addr8[ 0] | | |
+--------------+ u6_addr16[0] | |
0x40000001 | u6_addr8[ 1] | | |
+--------------+--------------+ u6_addr32[0] |
0x40000002 | u6_addr8[ 2] | | |
+--------------+ u6_addr16[1] | |
0x40000003 | u6_addr8[ 3] | | |
+--------------+--------------+--------------+
0x40000004 | u6_addr8[ 4] | | |
+--------------+ u6_addr16[2] | |
0x40000005 | u6_addr8[ 5] | | |
+--------------+--------------+ u6_addr32[1] |
0x40000006 | u6_addr8[ 6] | | |
+--------------+ u6_addr16[3] | |
0x40000007 | u6_addr8[ 7] | | |
+--------------+--------------+--------------+
0x40000008 | u6_addr8[ 8] | | |
+--------------+ u6_addr16[4] | |
0x40000009 | u6_addr8[ 9] | | |
+--------------+--------------+ u6_addr32[2] |
0x4000000a | u6_addr8[10] | | |
+--------------+ u6_addr16[5] | |
0x4000000b | u6_addr8[11] | | |
+--------------+--------------+--------------+
0x4000000c | u6_addr8[12] | | |
+--------------+ u6_addr16[6] | |
0x4000000d | u6_addr8[13] | | |
+--------------+--------------+ u6_addr32[3] |
0x4000000e | u6_addr8[14] | | |
+--------------+ u6_addr16[7] | |
0x4000000f | u6_addr8[15] | | |
+--------------+--------------+--------------+

假设您了解您的特定 C 实现如何布局各种类型,这提供了一种以不同方式引用相同数据的方法。

关于c - 看不懂struct Barnyard2的sf_ip头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15310326/

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