首页 > 解决方案 > 拥有一个大小为零的指针数组意味着什么?

问题描述

我在linux内核源代码()中遇到了一个struct看起来像这样的定义net/ipv4/fib_trie.c-

 
struct key_vector {
    t_key key;
    unsigned char pos;      /* 2log(KEYLENGTH) bits needed */
    unsigned char bits;     /* 2log(KEYLENGTH) bits needed */
    unsigned char slen;
    union {
        /* This list pointer if valid if (pos | bits) == 0 (LEAF) */
        struct hlist_head leaf;
        /* This array is valid if (pos | bits) > 0 (TNODE) */
        struct key_vector __rcu *tnode[0];
    };
};

上面的定义是什么tnode意思?我写了一个示例代码来理解和打印看起来像 -


struct s {
    union {
        int i;
        int *pi[0];
    };
};

int main()
{
    struct s s1;
    s1.i = 0x12345678;

    printf("sizeof(s1): %lu, s1.i: %x, s1.pi: %p, s1.*pi: %p\n", sizeof(s1), s1.i, s1.pi[0], s1.pi);
}

其输出是 -

sizeof(s1): 8, s1.i: 12345678, s1.pi: 0x7ffc12345678, s1.*pi: 0x7ffc2824add0

我不完全确定我是否理解这一点。

标签: clinux-kernel

解决方案


这是一种称为“结构黑客”或灵活数组成员的常见做法。为结构分配内存时,您会添加额外的空间。然后可以使用结构末尾的数组成员访问额外的空间。从 C99 开始,您可以完全省略大小。


推荐阅读