У меня есть структура:
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_attribute.
2) Я вызываю функциюstruct_generic_attribute, внутри которой программа снова выделяет кусок памяти размером со структуру generic_attribute. Он выводит указатель на этот фрагмент памяти.
3) Вstruct_tagged_attribute я установил "общий" указатель, равный указателю, выводимому функцией build_generic_attribute, так что теперь они оба указывают на один и тот же слот памяти.
Однако, похоже, я выделяю в два раза больше памяти, чем мне нужно выделить.
Есть ли способ выделить память только один раз, не получая ошибки сегментации из-за того, что не удалось выделить место для «общего» указателя? Или я неправильно понимаю, что происходит в этом коде?