正如其他答案所述,数组不可直接分配,您必须使用以下函数memcpy
:
memcpy(myStruct.data, generatedArray, sizeof(myStruct.data));
然而...
C是一门历史悠久的语言。早期语言大致有“小”和“大”类型的概念,前者可以直接赋值,而后者不能。后来的一些语言使一切都可以分配(或对于函数式语言,值)。
原始 C 有原始类型;整数、浮点数等;和这些类型的数组。前者是“小”,是可分配的,后者是“大”,不是。随后C获得了结构,并认为这些是“小”的......
所以,有点奇怪,虽然您不能直接将一个数组分配给另一个数组,但您可以将结构分配给另一个数组,特别是您可以分配一个只有一个字段的结构,它是一个数组......您还可以编写文字结构值,包括那些具有数组值字段的人;并且作为具有“类型是注释”方法的C,您可以将指向数组的指针转换为指向结构的指针......
以上意味着您可以编写“有趣”的代码,例如:
typedef struct
{
uint8_t type;
uint8_t data[10];
} MyStruct;
typedef struct
{
uint8_t data[10];
} MyArray;
typedef struct
{
uint8_t type;
MyArray array;
} MyStruct2;
void arrayAssignment(int x)
{
MyStruct myStruct;
MyArray generatedArray = {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}; // structure literal
*(MyArray *)&myStruct.data = generatedArray;
uint8_t generatedArray2[] = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20}; // array literal
*(MyArray *)&myStruct.data = *(MyArray *)generatedArray2;
MyStruct2 myStruct2;
myStruct2.array = generatedArray; // no casts at all, but element access is myStruct2.array.data[index]
}
请注意,没有任何强制转换、间接寻址等,或者在最后一个示例array.
中,索引中的额外成本在编译代码中没有任何成本——它们都是说服编译器使用其内置数组分配的简单方法。
许多人当然会反对经常使用这些技术!