Почему в 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 шт):

Автор решения: banana

А какой средой разработки пользуетесь? VS, например, подчеркивает 2 ошибки в месте, где Вы выделяете память, например то, что выделяете память под указатель на тип, а не на тип как таковой, и то что malloc возвращает void*, а у Вас, item_of_list*.

Так же, насколько я понимаю, суть связных списков в том, что они не находятся в памяти подряд, как массив. А Вы пытаетесь разово выделить память под весь список. Думаю, экономия на системных вызовах тут неуместна

→ Ссылка