Размер, который вы указываете для массива, должен быть константным выражением.У вас есть пара вариантов.Можно было бы включить пару указателей и динамически распределить пространство:
typedef struct {
int* original;
int size;
int *first;
int *second;
} arr_struct;
Другая возможность состояла бы в том, чтобы использовать только один массив и создать в нем указатель на соответствующую точку:
typedef struct {
int* original;
int size;
int *second;
int first[];
} arr_struct;
При этом используется гибкий элемент массива, новый для C99 - если вы используете устаревший компилятор C (например, MS VC ++), он может не поддерживаться напрямую 1 .В любом случае это все еще требует динамического выделения, но позволяет вам сделать одно большое выделение для всех данных вместо трех отдельных выделений (одно для структуры и по одному для first
и second
).
arr_struct *my_struct = malloc(sizeof(*my_struct) + size * sizeof(int));
my_struct->second = my_struct->first + size/2;
Кроме того, обратите внимание на синтаксис для typedef
- так как ваш typedef
вообще не определял имя.
1 Обходной путьтривиально, хотя - просто определите first
с размером 1 и вычтите 1 из размера в вашем распределении:
arr_struct *my_struct = malloc(sizeof(*my_struct) + (size-1) * sizeof(int));
Теоретически это не обязательно работает, но на самом деле это просто хорошовсе настоящие компиляторы, как минимум AFAIK.