Если вы распечатываете небольшие данные, это может помочь вам понять, что они делают;где * назначен заголовок, вставьте в строку:
printf(“*(%p) = %p\n”, listhead, curr->next);
Я сделал для списка len 4:
*(0x79628344) = 0x79628320
*(0x79628354) = 0x79628320
*(0x79628364) = 0x79628320
*(0xbff92bd0) = 0x79628320
Мы видим, что сам заголовок имеет несколько различных значений;и когда мы смотрим на рекурсивный вызов, это имеет смысл.Каждый раз, когда он вызывается с использованием next в качестве заголовка списка, каждый узел обновляется.Из моего рисунка видно, что адрес, который не является смежным с остальными, является адресом стека, где находится конечный заголовок списка.