不了解struct Barnyard2的sf_ip头文件

时间:2013-03-09 11:50:00

标签: c struct

我在看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;

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

1 个答案:

答案 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实现如何列出各种类型,这提供了一种以不同方式引用相同数据的方法。