Неправильное использование элемента гибкого массива (не так, как другие) - PullRequest
0 голосов
/ 12 января 2019

Итак, у меня есть эти 2 структуры:

typedef struct item { 
    const char *label;
    int value;
} Item;

typedef struct item_coll { 
    size_t length; 
    Item items[]; 
} ItemColl;

И я хочу сделать это:

 int main() {

    Item a = {"A", 10};
    Item b = {"B", 20};
    Item c = {"C", 30};

    Item items[] = {a, b, c};

    size_t length = sizeof(items)/sizeof(items[0]);

    ItemColl *column = malloc (sizeof(column) + length * sizeof(Item));

    column -> length = length;
    column -> items = items;

    printf("%ld\n", column -> length);

    return 0;
}

Но я получаю ошибку «Неправильное использование элемента гибкого массива» здесь:

column -> items = items;

Насколько я знаю, я выделяю необходимое пространство, поэтому не понимаю, в чем проблема.

Я видел еще 2 сообщения с таким названием, но ни одно из них не решает мою проблему, так как я попробовал ответы на эти вопросы.

1 Ответ

0 голосов
/ 12 января 2019

Как уже упоминали другие, вы не можете назначить один массив другому.

Отчасти потому, что компилятор не всегда может знать, какой длины массив, особенно для гибкого члена массива. (например) Кроме того, источник или цель могут быть указателем. Чтобы быть последовательным, это просто помечает это.

Итак, измените:

column->items = items;

до:

for (int idx = 0;  idx < length;  ++idx)
    column->items[idx] = items[idx];

Или использовать memcpy:

memcpy(column->items, items, sizeof(column->items[0]) * length);

Примечание:

Если бы column->items был указатель (например, Item *items) вместо этого, выполните:

column->items = items;

будет действительным. Но не скопирует значения . Было бы просто установить указатель структуры на адрес массива области действия функции items. Это не будет желаемым результатом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...