В моих приключениях по реализации общих структур данных в C я столкнулся с дилеммой.Например, в следующем коде:
void add_something(avl_tree_t * my_tree) {
int new_element = 123;
avl_insert(my_tree, (void*)&new_element);
}
int main() {
avl_tree_t * my_tree = avl_create();
add_something(my_tree);
// do stuff
avl_print(my_tree, function_that_prints_ints);
exit(0);
}
, в котором avl_insert
определен как
void avl_insert(avl_tree_t * tree, void * data) {
avl_node_t * new_node = malloc(sizeof(struct avl_node));
new_node->data = data;
// do tree balancing stuff
}
Чтобы моя универсальная функция вставки работала, я должен передать ееvoid *
предмет для хранения.Однако для того, чтобы это сработало, в этом случае мне нужно передать адрес нового элемента int
, который я добавляю, чтобы затем я мог разыменовать его до void *
.Если я не ошибаюсь, когда мы вернемся к функции main
, адрес памяти, в котором я сохранил мой новый элемент, будет скомпрометирован.
Один из способов, с помощью которого я решил решить эту проблему, - передатьв размере вещей, которые я храню в дереве в качестве параметра для avl_create
, а затем выделяю память для копии каждого элемента, который я вставляю.Это работает, потому что вам не нужен исходный адрес или значение для того, что вы добавили.
Еще одна вещь, которая работает, - это использование только структуры данных в диапазоне одной функции, которая, очевидно, нежизнеспособна.
У меня такой вопрос: как лучше всего хранить статически распределенные данные в общей структуре данных, будь то базовые типы C или пользовательские структуры?
Заранее спасибо.