Ошибка: недопустимое использование члена гибкого массива

Я не знаю, почему этот код дает эту ошибку. Что я должен делать? Ошибка заключается в следующем:

Неправильное использование члена гибкого массива

на этой линии:

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 может быть не то же самое).

Другие вопросы по тегам