C Struct数组成员没有特定长度

时间:2013-06-19 07:26:57

标签: c gcc

我遇到过这段代码:

struct test                   
{                                        
 uint32       num_fields;            
 char array_field [];               
}; 

我如何理解array_field?这是C语言的gcc扩展吗?

2 个答案:

答案 0 :(得分:15)

这是一个C99功能,称为灵活数组成员,通常用于创建可变长度数组。

它只能指定为 struct 的最后一个成员而不指定大小(如array_field [];中所示)。


例如,您可以执行以下操作,成员arr将为其分配5个字节:

struct flexi_example
{
int data;
char arr[];
};


struct flexi_example *obj;

obj = malloc(sizeof (struct flexi_example) + 5);

这里讨论了它的优缺点:

<强> Flexible array members in C - bad?

答案 1 :(得分:1)

此类结构通常在堆上以计算的大小分配,代码如下:

#include <stddef.h>

struct test * test_new(uint32 num_fields)
{
    size_t sizeBeforeArray = offsetof(struct test, array_field);
    size_t sizeOfArray = num_fields * sizeof(char);
    struct test * ret = malloc(sizeBeforeArray + sizeOfArray);
    if(NULL != ret)
    {
        ret->num_fields = num_fields;
    }
    return ret;
}