错误:灵活数组成员的使用无效

时间:2013-11-27 10:13:13

标签: c arrays struct flexible-array-member

我不知道为什么这段代码会出现此错误。我该怎么办?错误如下:

  

无效使用灵活数组成员

在这一行:

new_buffer->array_msg =array;

这里是更大的代码部分:

   typedef struct buffer {
    int size;
    int T;
    int D;
    int msg_presenti;

    pthread_cond_t not_full;
    pthread_cond_t not_empty;
    pthread_mutex_t mutex;
    msg_t * array_msg[];

} buffer_t;

buffer_t * buffer_init(unsigned int maxsize){
    buffer_t * new_buffer = malloc( sizeof(buffer_t) + maxsize * sizeof(msg_t) );

    msg_t * array[maxsize];
    new_buffer->array_msg =array;
    new_buffer->size=maxsize;
    return new_buffer;
}
// deallocazione di un buffer

1 个答案:

答案 0 :(得分:1)

此行足以为 struct 和灵活数组成员分配空间:

buffer_t * new_buffer = malloc( sizeof(buffer_t) + maxsize * sizeof(msg_t *) );
                                ^                  ^
                                1                  2

1将为 struct 分配内存,而2将为灵活数组成员分配空间,因此您的函数应如下所示:

buffer_t * buffer_init(unsigned int maxsize)
{
    buffer_t * new_buffer = malloc( sizeof(buffer_t) + maxsize * sizeof(msg_t) );

    new_buffer->size=maxsize;
    return new_buffer;
}

如果我们查看draft C99 standard 部分6.7.2.1结构和联合说明符段落 17 ,则提供以下示例:

  

示例声明后:

struct s { int n; double d[]; };
     

结构struct s具有灵活的数组成员d。使用它的典型方法是:

int m = /* some value */;
struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));
     

并假设对malloc的调用成功,p指向的对象在大多数情况下都表现为,如同p已被声明为:

struct { int n; double d[m]; } *p;
     

(在某些情况下,这种等价性被破坏;特别是,成员d的偏移量可能不同。)