Адрес указателя не меняется в списке ссылок - PullRequest
0 голосов
/ 19 августа 2011

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

2 голосов
/ 19 августа 2011

Думаю, причина в том, что в цикле while вы объявляете x в стеке.Затем, после окончания цикла while, переменная «уничтожается».Однако на следующей итерации x снова зарезервируется в стеке, используя то же самое место в стеке.

Обратите внимание, что вы не получите связанный список с допустимыми указателями.Вам нужно создать экземпляры Node в куче, используя оператор 'new'.

EDIT:

Если вы не хотите выделять память в куче, вы можете использоватьподход «Связанные списки с использованием массивов узлов» описан здесь .Однако недостатком является то, что вам необходимо заранее знать максимальное количество узлов.

2 голосов
/ 19 августа 2011

В первой итерации цикла q содержит адрес head. На каждой последующей итерации q содержит адрес x.

Это означает, что на первой итерации q->next возвращает адрес head, а на каждой последующей итерации q->next возвращает адрес x. Однако x создается внутри цикла в стеке. Поскольку между стеком нет изменений, объект x всегда появляется в одном и том же месте стека.

Таким образом, я ожидаю, что программа сначала напечатает адрес head, а затем в четыре раза больше адреса четырех x объектов (все они расположены в одной и той же позиции стека). *

1 голос
/ 19 августа 2011

Ваш x-узел размещается в локальном стеке, а не в куче, поэтому, когда ваша переменная перезапускается при каждой итерации цикла, она получает один и тот же локальный адрес. Чтобы создать i = 5 uique узлов, вам нужно разместить объект в куче с помощью оператора new (). Вы также должны добавить код для удаления выделенных объектов впоследствии.

example:


Node * px = new  Node(i*10, 1);
1 голос
/ 19 августа 2011

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

Node x(i * 10, q);
1 голос
/ 19 августа 2011

Узел х создается в стеке, каждый раз, когда вы обходите цикл, он будет создаваться, а затем снова уничтожаться в конце блока. И каждый раз вокруг цикла он будет создаваться в одном и том же месте.

Вы, вероятно, хотите:

Node *x = new Node( i*10, q );
q = x;
1 голос
/ 19 августа 2011

x является локальной переменной в цикле while. Его время жизни - только одна итерация цикла.

Вы должны динамически распределять объекты Node следующим образом:

Node* x = new Node(value, next);

так что их время жизни длится, пока вы не выделите объект:

delete x;
1 голос
/ 19 августа 2011

Это связано со способом выделения x: это локальная переменная внутри главной функции. Это означает, что он расположен в стеке, в определенной позиции. Вы постоянно используете один и тот же кусок памяти. Вместо этого попробуйте выделить память для новых узлов (new).

1 голос
/ 19 августа 2011

Вы создаете узел в стеке - попробуйте использовать новый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...