0

Я не понимаю, как динамически выделять память для массива структур в другой структуре. Как и в, вот моя проблема ... У меня есть файл project.c, который содержит основной, у меня есть еще один файл polyomial.c, который обрабатывает все поли операции, такие как добавление терминов, умножение многочлена на числовое значение.Динамическое распределение памяти в массиве внутри структуры,

Это заголовочный файл для polynomials.h

typedef struct term{ 
    int coeff; 
    int expo; 
} TERM; 

typedef struct polynomial { 

int size; 
// This needs to be changed to calloc.. not sure how within a struct 
TERM terms[20]; 

} POLYNOMIAL; 
... 
... 

у меня также есть это в моем файле project.c, который динамически выделяет память для поли массива.

POLYNOMIAL *polynomials = (POLYNOMIAL *)malloc(sizeof(POLYNOMIAL) * 8); 
// 8 being the max number of polynomials I wan to store 

У меня есть два вопроса здесь, когда и как следует динамически выделять память для массива терминов? Я думал, возможно, сделать указатель на указатель, который держит память calloc для пустого массива терминов. Это будет сделано при запуске программы, но после выделения полинома (я думаю).

Другой вопрос. Теперь, когда я иду освобождать память, это должно быть сделано в конце программы до ее выхода и порядок, в котором я свободен, должен быть снизу вверх, правильно? Другими словами, освободите массив термов, а затем полиномиальный массив.

На этом этапе были бы полезны любые подсказки или рекомендации. Благодаря!

ответ

1

Вы можете просто выделить его с

TERM *terms = calloc(20, sizeof(TERM)); 

Вы не можете сделать это непосредственно в объявлении структуры, так что вы собираетесь сделать что-то вроде

POLYNOMIAL *polynomials = calloc(size, sizeof(POLYNOMIAL)); 

for (int i = 0; i < size; ++i) 
    polynomials[i].terms = calloc(20, sizeof(TERM)); 

И да, вы будете нужно освободить память снизу вверх, сначала вы освободите все условия, затем вы освободите массив POLYNOMIALS.

+3

Это относится к тому, что он делает домашнее задание для него. Разве не лучше было бы это решить, но привести его к решению, не сделав этого для него? –

+0

Когда и где должны вызываться * термины calloc? – Hall9

+0

Главное, чтобы полиномы, которые вы используете, указывали на действительные указатели, иначе вы не можете назначить их членов. – Jack

0

Поскольку ваш вопрос помечен домашним заданием, я точно не скажу вам.

TERM terms[20] - это буквальный массив на месте. Если вы объявили такую ​​переменную в функции, она зарезервировала бы ровно пространство в стеке для этого количества элементов массива. Если бы вы сделали это внутри структуры, это оставило бы пространство внутри самой структуры. Поэтому вас попросили что-то изменить с X x[n] на эквивалентный синтаксис указателя, который также используется для синтаксиса массива.

Вы уже написали POLYNOMIAL * polynomials, чтобы вы знали, что это как (a) указатель на один многочлен, либо (b) указатель на массив многочленов, и что вы можете его инициализировать с помощью выражения malloc.

Если вы используете то, что вы уже знаете из вопроса, вы наверняка увидите, что вас попросят ввести в себя; Чтобы вы могли переписать поле term таким образом, чтобы оно могло указывать на одну или несколько структур TERM.

0

Для начала свой polynomial-структуру должен выглядеть следующим образом:

typedef struct polynomial { 
    int size; 
    TERM *terms; 
} POLYNOMIAL; 

Тогда для каждого polynomial структуры у вас есть:

p.terms = calloc(size, sizeof(*terms)); 

Вам нужно будет освободить память, на которую указывает terms, прежде чем бесплатно структуры polynomial, так как вам не будет разрешен доступ к элементу terms.

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

  • Нет связанных вопросов^_^