我不知道为什么这段代码会出现此错误。我该怎么办?错误如下:
无效使用灵活数组成员
在这一行:
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
答案 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
的偏移量可能不同。)