内核中有写零长度数组,有时候看代码会迷糊,现在做个实验:
#include <stdio.h>
typedef struct my {
int a;
int b;
int c[0];
} my_ins;
void main()
{
my_ins *ins1 = malloc(sizeof(my_ins) + sizeof(my_ins));
my_ins *ins2 = ins1->c;
my_ins *ins3 = (my_ins*)((unsigned char*)(ins1) + sizeof(my_ins));
ins1->a = 0;
ins1->b = 2;
ins2->a = 45;
printf("my_ins size %d\n", sizeof(my_ins));
printf("ins2 0x%x, ins3 0x%x\n", ins2, ins3);
printf("ins2 a %d, ins1 c %d\n", ins2->a, ins1->c[0]);
printf("ins1 a %d, b %d, c 0x%x\n", ins1->a, ins1->b, ins1->c);
printf("ins1 a %d, b %d, c %d\n", ins1->a, ins1->b, *ins1->c);
}
输出结果:
my_ins size 8 //零长度数组不算在大小内,因为size是0.
ins2 0xb9c018, ins3 0xb9c018
ins2 a 45, ins1 c 45
ins1 a 0, b 2, c 0xb9c018
ins1 a 0, b 2, c 45
可见,零长度数组c在结构体当中可以作为结构体后缀的地址,所谓结构体后缀就是给一个结构体增加大小,除开基本的元素外,还可以存一些其他的结构在里面。
这个在网络应用编程当中用得也比较多。