无效使用了灵活数组成员(不是其他成员)

时间:2019-01-12 20:01:52

标签: c arrays struct flexible-array-member

所以我有以下两种结构:

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 :(得分:2)

正如其他人所提到的,您不能将一个数组分配给另一个。

部分是因为编译器不能总是知道数组有多长时间,尤其是对于灵活的数组成员而言。 (例如)此外,源或目标都可以是指针。为了保持一致,它只是对其进行标记。

因此,更改:

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的地址。这不是理想的结果。