Ошибка: нестатическая инициализация гибкого участника массива в некоторых случаях, но не других [дублировать]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Ошибка: нестатическая инициализация гибкого участника массива в некоторых случаях, но не других [дублировать]

Сообщение Anonymous »

Я использую последнюю версию G ++ для составления некоторого тестового кода, включающего массив конструктивных указателей, где структуры содержат массив. Компиляция терпит неудачу, когда я пытаюсь инициализировать массив указателей структуры в одной строке, но если я назначаю структуры с переменными, а затем беру их адреса при создании массива, G ++ не жалуется. Я хочу понять, почему. Это мой первый пост, поэтому я прошу прощения, если не хватает информации.

Код: Выделить всё

#include 

typedef struct {
uint16_t num_elements;
uint8_t elements[];
} HasArray;

HasArray x = {.num_elements = 2, .elements = {51, 17}};
HasArray y = {.num_elements = 4, .elements = {1, 42, 88, 73}};

const HasArray* collection[] = {&x, &y};

// main() somewhere
Приведенный выше код работает, что, я предполагаю, потому что G ++ может выделять память для x и y во время компиляции (или что -то подобное). Если я попытаюсь инициализировать коллекцию как SO:

Код: Выделить всё

// HasArray cast is necessary so I can take the address, doing `&` on just the `{}`
// didn't work
// Also I would use a macro for these declarations, I know it's clunky
const HasArray* collection[] = {
&(HasArray){.num_elements = 2, .elements = {51, 17}},
&(HasArray){.num_elements = 4, .elements = {1, 42, 88, 73}}
};
< /code>
g ++ броски < /p>
test.c:16:56: error: non-static initialization of a flexible array member
16 |     &(HasArray){.num_elements = 2, .elements = {51, 17}},
|                                                        ^
test.c:17:63: error: non-static initialization of a flexible array member
17 |     &(HasArray){.num_elements = 4, .elements = {1, 42, 88, 73}}
|                                                               ^
< /code>
Что отличает эти ситуации? В моем мозгу второй синтаксис все равно будет выделять память во время компиляции, но, похоже, это не так. Я понимаю, что могу выделить память во время выполнения с помощью Malloc () 
, но первая ситуация не требует этого, и i знайте размер структур во время компиляции, так как я могу укажите размер компилятора без создания отдельных переменных для каждой структуры?

Подробнее здесь: https://stackoverflow.com/questions/794 ... ses-but-no
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»