Во втором фрагменте кода:
void pushToList(node * listHead, int val) {
node * temp = malloc(sizeof(node));
temp->value = val;
temp->next = listHead;
listHead = temp;
}
Вызывающий передает указатель на узел, называемый listHead
. Этот указатель передается по значению. Например:
node *myNode;
// ...
pushToList(myNode, 123);
Последняя строка функции перезаписывает локальную переменную listHead
, но это не влияет на значение вызывающей стороны (здесь myNode
). Фактически, значение, переданное функции, может даже не быть lvalue: рассмотрим следующий пример:
node nn; // stack-allocated
pushToList(&nn, 123);
Правильное решение, которое вы предоставляете в первом примере, - это передать указатель на указатель на узел, чтобы функция pu sh могла обновлять этот указатель на узел.