Адрес указателя не меняется в списке ссылок
Моя проблема q->next
всегда печатает один и тот же адрес, но я назначил q = &x;
, Почему он не печатает разные адреса?
#include <stdio.h>
class Node
{
public:
int val;
Node *next;
Node(int v,Node *p) { val=v, next=p; }
};
int main()
{
Node head(0, NULL);
Node *q = &head;
int i = 5;
while (i>0)
{
Node x(i * 10, q);
q = &x;
printf("# %d %p\n", q->val, q->next);
i--;
}
}
8 ответов
Это связано с тем, как распределяется x: это локальная переменная внутри главной функции. Это означает, что он расположен в стеке в определенной позиции. Вы постоянно используете один и тот же кусок памяти. Вместо этого попробуйте выделить память для новых узлов (new
).
На первой итерации цикла q
содержит адрес head
, На каждой последующей итерации q
содержит адрес x
,
Это означает, что на первой итерации q->next
дает адрес head
и на каждой последующей итерации, q->next
дает адрес x
, Тем не мение, x
создается внутри цикла, в стеке. Поскольку между стеком нет изменений, x
Объект всегда появляется в одном и том же месте стека.
Так что я ожидаю, что программа сначала напечатает адрес head
а затем четыре раза адрес четырех x
объекты (которые все оказываются расположенными в одной и той же позиции стека).
Я думаю, причина в том, что в цикле while вы объявляете x в стеке. Затем, после завершения цикла while, переменная "уничтожается". Однако на следующей итерации x снова зарезервируется в стеке, используя то же самое место в стеке.
Обратите внимание, что вы не получите связанный список с действительными указателями. Вам нужно создать экземпляры Node в куче, используя оператор 'new'.
РЕДАКТИРОВАТЬ:
Если вы не хотите выделять память в куче, вы можете использовать описанный здесь подход "Связанные списки с использованием массивов узлов". Недостатком является, однако, то, что вам нужно знать максимальное количество узлов заранее.
x
является локальной переменной в while
петля. Его время жизни - только одна итерация цикла.
Вы должны динамически распределять Node
объекты вроде так:
Node* x = new Node(value, next);
так что их время жизни длится до тех пор, пока вы не выделите объект:
delete x;
Ваш x-узел размещается в локальном стеке, а не в куче, поэтому, когда ваша переменная перезапускается при каждой итерации цикла, она получает один и тот же локальный адрес. Чтобы создать узлы i = 5 uique, вам нужно разместить объект в куче с помощью оператора new(). Вы также должны добавить код для удаления ваших выделенных объектов впоследствии.
example:
Node * px = new Node(i*10, 1);
Узел х создается в стеке, каждый раз, когда вы обходите цикл, он будет создаваться, а затем снова уничтожаться в конце блока. И каждый раз вокруг цикла он будет создаваться в одном и том же месте.
Вы, вероятно, хотите:
Node *x = new Node( i*10, q );
q = x;