Почему в first_item попадает последний элемент односвязного списка? Что там не так с "памятью из кучи"?
Функция преобразует массив размером "size" в односвязный перечень. Чтобы сэкономить на системных вызовах, выделяю память из кучи одним разом. В результате в first_item попадает последний элемент. В чем проблема?
struct item_of_list *array_to_list(const int *array, int size){
struct item_of_list *first_item=NULL,
*current_item = NULL,
*last_item=NULL;
current_item = malloc( sizeof(*first_item) * size );
/*Мне кажется, что проблема вот здесь и я не правильно понимаю, как память выделяется из кучи*/
for (int i = 0; i < size; i++) {
/*Здесь я на каждой итерации создаю и заполняю следующий элемент списка*/
current_item->data = *(array+i);
current_item->next=NULL;
if (last_item) {
/*Добавляю заполненный элемент в список, если не пуст*/
last_item->next=current_item;
last_item = last_item->next;
} else {
/*Если список был пуст, то все указатели указывают на первый добавленный элемент списка*/
first_item=last_item=current_item;
}
}
Ответы (1 шт):
А какой средой разработки пользуетесь? VS, например, подчеркивает 2 ошибки в месте, где Вы выделяете память, например то, что выделяете память под указатель на тип, а не на тип как таковой, и то что malloc возвращает void*, а у Вас, item_of_list*.
Так же, насколько я понимаю, суть связных списков в том, что они не находятся в памяти подряд, как массив. А Вы пытаетесь разово выделить память под весь список. Думаю, экономия на системных вызовах тут неуместна