Сначала вы не хотите этого:
Polynom res = malloc(sizeof(struct PolynomStruct));
res->size = 10;
Вы выделили пространство для структуры, но не инициализировали нужный указатель term
:
Polynom res = malloc(sizeof(struct PolynomStruct));
if(res==NULL){
//Handle allocation failure...
}
res_>term=NULL;
res->size = 0;
//Later....
free(res->term);
free(res);
Это выделяет пространство для struct
и инициализирует массив как пустой.
Обратите внимание, что нормально передавать NULL
в free()
, он ничего не делает и возвращает нормально.
Или, если вы хотите предварительно выделить 10 терминов:
Polynom res = malloc(sizeof(struct PolynomStruct));
if(res==NULL){
//Handle allocation failure...
}
res->size = 10;
res_>term=malloc(res->size*sizeof(double));
if(res->term==NULL){
res->size=0;
//Handle error...
}
//Later (when finished with res)...
free(res->term);
free(res);
Это предварительно распределяет массив до 10. Если вы предварительно распределили, вы можете отслеживать capac
(сколько выделено) и size
(сколько используется). Но это выходит за рамки здесь.
Чтобы перераспределить, напишите такую функцию:
int reallocate(Polynom res,int newsize){
double *resized=realloc(res->term,newsize*sizeof(double));
if (resize==NULL){
//Allocation failed. The array is the same size as before.
return 1; //Or handle error your own way.
}
res->term=resized;
res->size=newsize;
//realloc may extend the space allocated in place or realloc space elsewhere.
//If it does reallocate elsewhere the current contents are just copied over
//(byte for byte) and the old space freed.
return 0;//Success. No error.
}
//Later (when finished with res)...
free(res->term);
free(res);
Часто бывает разумно res=NULL;
, чтобы избежать путаницы.
Обратите внимание: если указатель был возвращен malloc
или realloc
(а не NULL
), он должен перейти к free()
(ровно один раз).
Также обратите внимание, realloc
может уменьшить размер, так что newsize < res->size
в порядке.