Это утверждение в fillList
record = first;
не влияет на переменную list
в main
. Указатели передаются по значению (как и все остальное) в C
. Если вы хотите обновить переменную list
в main
, вам придется либо передать на нее указатель (&list
) и соответственно изменить fillList
, либо вернуть numberRecord*
из fillList
. (Я бы на самом деле пошел с этим вторым вариантом.)
Вот (плохая) иллюстрация:
Когда main
вызывает fillList, в начальной точке этой функции указатели выглядят следующим образом:
main memory fillList
list ----> 0x01234 <---- record
Чуть позже, в fillList
, вы выделяете некоторое хранилище для new
(на самом деле это плохое имя, оно конфликтует с оператором в C ++, вводит людей в замешательство)
main memory fillList
list ----> 0x01234 <---- record
0x03123 <---- new
В последней строке fillList
у вас осталось:
main memory fillList
list ----> 0x01234 ,-- record
0x03123 <---- new
record
и list
не являются одной и той же переменной. Они начинаются с одинакового значения, но изменение record
не изменит list
. Тот факт, что они оба указатели, ничем не отличается от, скажем, int
s в этом отношении.
Вы можете изменить вещь , указанную на по списку в fillList
, но вы не можете изменить то, что list
указывает на (с вашей версией кода).
Самый простой способ обойти это изменить fillList
следующим образом:
numberRecord *fillList() {
....
return new;
}
А в main
не выделяйте list
напрямую, просто позвоните fillList()
, чтобы инициализировать его.