2015-06-26 4 views
-1

То, что я хотел бы иметь, это struct так:Struct с несколькими массивами, размер которых определяется во время выполнения

struct Store{ 
    int client_debts[]; 
    struct items[]; 
}; 

Когда начинается выполнение, программа чтения файла ввода, который определяет размер массивы в этом struct, так что я мог бы сделать что-то вроде этого:

struct Store s; 
int client_debts[defined_size]; 
s.client_debts = client_debts; 

Как я могу добиться этого?

PD: Я попытался с помощью указателей в struct и затем назначая им массивы, но когда функция, которая создала массивы закончилась, память массива освобождаются таким образом указатель хранит указывая на неназначенные памяти, таким образом, создавая ошибку сегментации ,

+0

Чтобы сделать это, вы должны использовать динамический mem, динамический mem никогда не выходит за рамки, поэтому он никогда не будет освобожден, пока вы этого не сделаете. – DGomez

ответ

3

Обычный способ сделать то, что вы хотите, чтобы выделить их динамически:

struct Store{ 
    int    *client_debts; 
    struct mystruct *items; 
}; 

struct Store store; 
int n; 

scanf ("%d", &n); 
if (n <= 0) 
    error_message(); 

store.client_debts = malloc (sizeof (*store.client_debts) * n); 
store.items  = malloc (sizeof (*store.items) * n); 
if (!store.client_debts || !store.items) 
    error_message(); 

Несмотря на то, что они являются указателями, они будут действовать так же, как массивы исходной декларации.

+0

Возможно, вы имели в виду sizeof (int) * n ?; то же самое с другой переменной –

+0

... или даже 'sizeof (* store.client_debts) * n' –

+0

@giorgi: Нет. То, как я его написал, имеет наибольшее сопротивление ошибкам, возникшим во время модификации. Что делать, если тип этих полей изменяется? – wallyk

Смежные вопросы