c - 拥有一个大小为零的指针数组意味着什么?
问题描述
我在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
我不完全确定我是否理解这一点。
解决方案
这是一种称为“结构黑客”或灵活数组成员的常见做法。为结构分配内存时,您会添加额外的空间。然后可以使用结构末尾的数组成员访问额外的空间。从 C99 开始,您可以完全省略大小。
推荐阅读
- numpy - PyCharm 2018.2.4 和 Anaconda 5.3.0
- eclipse - 尝试下载并安装eclipse
- amazon-web-services - 在 cloudformation 模板中设置堆栈级别标签 - 不在嵌套堆栈中
- php - Laravel 5.6 通过参数 id 进行依赖注入
- javascript - cypress throwing Uncaught TypeError: Illegal invocation似乎是误报
- android - 无法使用 Lombok 插件安装 apk
- css - 在同一个父级中使用多个粘性元素滚动
- c# - LINQ 查询 ToList() 转换为特定列表时无法转换对象
子类 - javascript - 侦听 HTML 元素,无需 setInterval
- sql - 如果给定列中的值之和不超过某个阈值,如何从数据库中的表中选择某个字段的值?