Имам структура:
struct generic_attribute{
int current_value;
int previous_value;
};
И конструктор, който извежда указател към тази структура:
struct generic_attribute* construct_generic_attribute(int current_value){
struct generic_attribute *ga_ptr;
ga_ptr = malloc (sizeof (struct generic_attribute));
ga_ptr->current_value = current_value;
ga_ptr->previous_value = 0;
return ga_ptr;
}
Сега, в друга функция, искам да дефинирам указател и да го настроя да сочи към същия адрес като указателя, който извежда горният конструктор.
struct tagged_attribute* construct_tagged_attribute(int num_args, int *args){
...
struct generic_attribute* generic = malloc (sizeof(struct generic_attribute));
generic = construct_generic_attribute(args[0]);
...
}
Изглежда, че това, което правя тук, е следното:
1) Дефинирам указател „generic“ и разпределям част от паметта, за да задържа екземпляр на структура generic_attribute.
2) Извиквам функция construct_generic_attribute, в рамките на която програмата отново разпределя част от паметта с размер на структура generic_attribute. Той извежда указател към тази част от паметта.
3) В construct_tagged_attribute зададох "генеричен" указател, равен на изхода на указателя от функцията construct_generic_attribute, така че сега и двата сочат към един и същ слот за памет.
Изглежда обаче, че разпределям два пъти повече памет, отколкото трябва да разпределя.
Има ли начин да разпределя памет само веднъж, без да получавам грешка при сегментиране, защото не успях да разпределя място за "генеричен" указател? Като алтернатива, погрешно ли разбирам какво се случва в този код?