使用struct {... char arr [1];构造?

时间:2013-01-30 16:43:58

标签: c

我查看了几个实例,其中我在下面的代码片段中看到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

3 个答案:

答案 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!");