Адрес указателя не меняется в списке ссылок

Моя проблема 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'.

РЕДАКТИРОВАТЬ:

Если вы не хотите выделять память в куче, вы можете использовать описанный здесь подход "Связанные списки с использованием массивов узлов". Недостатком является, однако, то, что вам нужно знать максимальное количество узлов заранее.

Вы продолжаете настройку next в q:

Node x(i * 10, q);

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;
Другие вопросы по тегам