他の回答が述べているように、配列は直接割り当て可能ではなく、次のような関数を使用する必要がありますmemcpy
。
memcpy(myStruct.data, generatedArray, sizeof(myStruct.data));
でも...
C は長い歴史を持つ言語です。初期の言語には大まかに「小さい」型と「大きい」型の概念があり、前者は直接割り当て可能で、後者はそうではありませんでした。後のいくつかの言語では、すべてが割り当て可能になりました (または関数型言語の場合は値)。
元の C にはプリミティブ型がありました。整数、浮動小数点数など。およびこれらのタイプの配列。前者は「小さい」ため割り当て可能であり、後者は「大きい」ため割り当て可能ではありませんでした。その後、Cは構造を獲得し、これらは「小さい」と判断しました...
したがって、少し奇妙なことに、ある配列を別の配列に直接割り当てることはできませんが、構造体を別の配列に割り当てることができます。特に、配列であるフィールドが 1 つだけの構造体を割り当てることができます...リテラル構造値を記述することもできます。配列値フィールドを持つものを含みます。そして、「型はコメントです」というアプローチの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.
では、コンパイルされたコードでインデックス作成の余分なコストが発生しないことに注意してください。これらはすべて、コンパイラに組み込みの配列割り当てを使用するよう説得するための単純な方法です。
もちろん、多くの人がこれらのテクニックを定期的に使用することに反対するでしょう!