我查看了几个实例,其中我在下面的代码片段中看到char fl[1]
之类的内容。我无法猜测这种构造的使用可能是什么。
struct test
{
int i;
double j;
char fl[1];
};
int main(int argc, char *argv[])
{
struct test a,b;
a.i=1;
a.j=12;
a.fl[0]='c';
b.i=2;
b.j=24;
memcpy(&(b.fl), "test1" , 6);
printf("%lu %lu\n", sizeof(a), sizeof(b));
printf("%s\n%s\n",a.fl,b.fl);
return 0;
}
输出 -
24 24
c<some junk characters here>
test1
答案 0 :(得分:7)
它被称为“结构黑客”,你可以在C FAQ阅读它。一般的想法是你为列出的结构分配更多的内存,然后在最后使用数组,好像它的长度大于1。
不再需要使用此hack,因为它已被C99 + flexible array members取代。
答案 1 :(得分:0)
这个想法通常是为可变大小数据命名,就像读取套接字的数据包一样:
struct message {
uint16_t len; /* tells length of the message */
uint16_t type; /* tells type of the message */
char payload[1]; /* placeholder for message data */
};
然后将缓冲区转换为struct
,并通过索引到数组成员来处理数据。
答案 2 :(得分:0)
请注意,您编写的代码是覆盖您不应该触摸的内存。 memcpy()
正在将多个字符写入一个字符数组。
用例通常更像是这样:
struct test *obj;
obj = malloc(sizeof(struct test) + 300); // 300 characters of space in the
// flexible member (the array).
obj->i = 3;
obj->j = 300;
snprintf(obj->f, 300, "hello!");