Я читаю очень популярный документ Стэнфорда * о связанных списках в C. В нем есть простая функция, которая строит простой LL с тремя членами. Единственное, чего я не получаю, и я смущен, заключается в том, что он говорит, что он хранит указатель head
в «локальной переменной стека». Но что head
указатель выделяется в кучу! Пожалуйста, взгляните на код и помогите мне понять, почему это локальная переменная стека?Ошибка путаницы в C
/*
Build the list {1, 2, 3} in the heap and store
its head pointer in a local stack variable.
Returns the head pointer to the caller.
*/
struct node* BuildOneTwoThree() {
struct node* head = NULL;
struct node* second = NULL;
struct node* third = NULL;
head = malloc(sizeof(struct node)); // allocate 3 nodes in the heap
second = malloc(sizeof(struct node));
third = malloc(sizeof(struct node));
head->data = 1; // setup first node
head->next = second; // note: pointer assignment rule
second->data = 2; // setup second node
second->next = third;
third->data = 3; // setup third link
third->next = NULL;
// At this point, the linked list referenced by "head"
// matches the list in the drawing.
return head;
}
В документе приведен нижеследующий чертеж для того, как будет выглядеть связанный список в памяти. Я не понимаю, почему указатель head
рисуется в области Stack!
*: http://cslibrary.stanford.edu/103/LinkedListBasics.pdf, страницы 5 и 6
Вы вводите в заблуждение «указатель« head' »и« вещь, на которую указывает указатель «head'». – immibis
Не могли бы вы рассказать? Код говорит, что указатель 'head' является локальным для этой функции. Какая локальная переменная? Все переменные ('head',' second' и 'third' находятся в куче. –
Этот указатель на ** ** **, * точно так же, как и все другие переменные в этой функции *, являются автоматическими (в вашем родном языке они живут «стек»). Подумайте об этом таким образом. По завершении всплытия переменная 'head' истекает и перестает существовать. Поэтому ее значение теряется.Итак, что произойдет, если вы * не * вернете значение в 'head', как результат функции для вызывающего, где вызывающий затем сохранил его? Если кто-то еще не сохраняет это значение (например, вы делаете это через «возврат» к вызывающему), он теряется навсегда, а вместе с ним и любой шанс «получить» ваш начальный узел вашего связанного списка. – WhozCraig