Ошибка: недопустимое использование члена гибкого массива
Я не знаю, почему этот код дает эту ошибку. Что я должен делать? Ошибка заключается в следующем:
Неправильное использование члена гибкого массива
на этой линии:
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 ответ
Этой строки достаточно, чтобы выделить место для вашей структуры и члена гибкого массива:
buffer_t * new_buffer = malloc( sizeof(buffer_t) + maxsize * sizeof(msg_t *) );
^ ^
1 2
1
выделит память для структуры в то время как 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;
}
Если мы посмотрим на проект стандартного раздела C99 6.7.2.1
В параграфе 17 спецификаторов структуры и объединения приведен следующий пример:
ПРИМЕР После объявления:
struct s { int n; double d[]; };
структура структура
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
может быть не то же самое).