使用一维数组初始化结构体数组

Initialise struct array with a 1d array

提问人:john_hatten2 提问时间:8/30/2023 最后编辑:john_hatten2 更新时间:8/30/2023 访问量:47

问:

我有一个常量数组,它来自我无法修改的定义。

#define MY_ARRAY {1,11,111,2,22,222,3,33,333}
#define SIZE 3

我想将这个数组分配给一个 const 结构数组

// EDIT : Added mixed sizes to show there might be a padding problem as well
struct foo {
    uint8_t val1; 
    uint32_t val2;
    uint32_t val3;
}

const struct foo my_foo[SIZE] = MY_ARRAY;

但是我的编译器抱怨在初始值设定项周围缺少大括号。它期望有如下内容:

const struct foo my_foo[SIZE] = {{1,11,111},{2,22,222},{3,33,333}};

我需要某种类型转换,但我无法让它工作

我试过这个:

const struct foo my_foo[SIZE] = (const struct foo[SIZE]) MY_ARRAY;

但我得到了同样的警告

C 铸造

评论


答:

0赞 PoolloverNathan 8/30/2023 #1

在这种情况下,您可能可以使用指针强制转换:

const int[SIZE * 3] numbers = MY_ARRAY;
const struct foo my_foo[SIZE] = *(*my_foo[])&numbers;

评论

0赞 Joel 8/30/2023
不起作用 godbolt.org/z/vaoE9781a
3赞 ensc 8/30/2023
这可能是未定义的行为,因为很可能有一个填充词,因此struct foosizeof numbers != sizeof my_foo
0赞 john_hatten2 8/30/2023
我真正的结构确实包含混合类型,所以填充可能是一个问题,是的
0赞 Andrew Henle 8/30/2023
@ensc 这也是一个严格的混叠违规,也是出于这个原因的 UB。