Вам нужно динамически выделить struct Box
.
struct Box *box1 = malloc(sizeof *box1 +
sizeof (Particle[number_of_particles]));
for (size_t i=0; i < number_of_particles; ++i)
box1->p[i] = po[i];
/* or memcpy(box1->p, po, sizeof po); */
Но если вы делаете вышеупомянутое, вы могли бы также объявить struct Box
, чтобы иметь указатель в нем. Член трюка гибкого массива полезен, если вы хотите, чтобы все данные в struct
были смежными. Если у вас в struct
есть указатель Point *
и он выделен динамически, расположение памяти для struct
и точек не будет смежным.
Причина, по которой вы получаете ошибку, заключается в том, что вы не можете назначить массив в C, а box->p
- это массив (из n1124 6.7.2.1p16):
Однако, когда у оператора .
(или ->
) есть левый операнд, который является (указатель) на структуру с элементом гибкого массива и правый операнд называет этот член, он ведет себя так, как если бы этот член был заменен самым длинным массивом (с тем же типом элемента), который не сделает структуру больше, чем объект, к которому осуществляется доступ; смещение массива должно оставаться смещением элемента гибкого массива, даже если оно будет отличаться от смещения массива замены. Если в этом массиве нет элементов, он ведет себя так, как если бы он имел один элемент, но поведение не определено, если предпринята какая-либо попытка получить доступ к этому элементу или сгенерировать указатель один за ним.
Кроме того, в вашем struct
должен быть хотя бы один член, кроме члена гибкого массива.