C语言 灵活数组成员的使用无效(与其他成员不同)



所以我有这两个结构:

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("%ldn", column -> length);
    return 0;
}

但是我在这里收到错误"灵活数组成员的使用无效":

column -> items = items;

据我所知,我正在分配所需的空间,这就是为什么我不明白问题是什么。

我又看到了 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。这不会是预期的结果。

最新更新