我在看Barnyard2的sf_ip.h source code。我不了解sfip_t stuct,特别是union块。
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;
为什么使用数组?我试图寻找文件,但谷歌一直没有运气。谁能解释一下这里要做什么了?
答案 0 :(得分:3)
C中的联合对其所有元素使用相同的内存块。这与元素在内存中连续的结构不同。
因此,如果您的变量在内存位置struct {int x; int y;}
开始,那么0x40000000
会被布局:
+-------------+
0x40000000 | x (4 bytes) |
+-------------+
0x40000004 | y (4 bytes) |
+-------------+
相关的union {int x; int y;}
就像这样存在:
Address
+-------------+-------------+
0x40000000 | x (4 bytes) | y (4 bytes) |
+-------------+-------------+
换句话说,它一次只能用于一个的东西,从技术上讲,上次使用{{1}时使用y
的行为是未定义的行为设置变量 - 虽然在这种情况下,你很可能会发现它会起作用,因为两种可能性是相同的类型。
在您的特定情况下,您有以下内存布局(假设您的变量位于x
):
0x40000000
假设您了解特定C实现如何列出各种类型,这提供了一种以不同方式引用相同数据的方法。