Почему выходные данные этого кода всегда одинаковы? - PullRequest
0 голосов
/ 28 апреля 2018

Почему я получаю такой же вывод в следующем цикле for в c ++.

node* nn =  (struct node*)malloc(sizeof(struct node));      
for(int i=0;i<10;i++)
{

    node* n =  (struct node*)malloc(sizeof(struct node)); 
    cout<<&n<<endl;
    nn->next = n;
    nn =n;
}

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Вы выводите &n, который является адресом n, а не содержимым n, что, вероятно, то, что вы хотели.

Примечание: вопрос был отредактирован после моего ответа, но та же проблема остается.

Попробуйте это:

#include <iostream>
#include <cstdlib>

struct node {
    node* next;
};

int main() {
    node* nn =  (struct node*)malloc(sizeof(struct node));      
    nn->next=nullptr;//Initialise so we can clean up nicely...
    for(int i=0;i<10;i++)
    {

        node* n =  (struct node*)malloc(sizeof(struct node)); 
        n->next=nullptr;//Initialise so we can clean up nicely...
        std::cout<<&n<<"=="<<n<<std::endl;
        nn->next = n;
        nn =n;
    }
    //Clean up after ourselves. Not relevant to the question but good practice.
    while(nn!=nullptr){
        node*n=nn;
        free(nn);
        nn=n;
    }
    return 0;
}

Типичный вывод:

0x7ffda1be2058==0x55ffb0b9fc20
0x7ffda1be2058==0x55ffb0ba0c50
0x7ffda1be2058==0x55ffb0ba0c70
0x7ffda1be2058==0x55ffb0ba0c90
0x7ffda1be2058==0x55ffb0ba0cb0
0x7ffda1be2058==0x55ffb0ba0cd0
0x7ffda1be2058==0x55ffb0ba0cf0
0x7ffda1be2058==0x55ffb0ba0d10
0x7ffda1be2058==0x55ffb0ba0d30
0x7ffda1be2058==0x55ffb0ba0d50

Фактический результат может отличаться, и в принципе компилятору не требуется хранить n по одному и тому же адресу каждую итерацию. Я не знаю ни одного компилятора, который этого не делает. Кто-нибудь?

Примечание: использование malloc() в C ++ очень редко рекомендуется. Прямой заменой malloc() и free() является new и delete. На практике используйте std::unique_ptr<> или другую самоуправляемую конструкцию.

0 голосов
/ 28 апреля 2018

Это только дополнение к melpomene ответ , отвечая на комментарии:

Как мне создать n узлов? Использование векторов запрещено, поэтому я создаю связанный связанный список из n узлов, но проблема в том, что я не могу создать n узлов в цикле.

На самом деле, ваш код был менее неправильным, чем вы думали, только вы пропустили один важный момент:

nn->next = n;

С помощью этой инструкции вы потеряли последнюю ссылку на то, на что изначально указывал nn, и вы никогда не сможете получить ее снова ...

Вам еще нужен второй указатель на элемент, созданный изначально , так что вы больше не потеряете заголовок списка и, следовательно, остальную часть списка:

node* nn = new node(); // this is the C++ way...
node* head = nn; // now you have a second pointer to the head... 

for(int i=0;i<10;i++)
/* [...] */

Теперь вы можете получить доступ ко всем узлам, которые вы создали, с помощью указателя head (до тех пор, пока вы не сдвинете его с ...).

Избавьтесь от цикла и просто используйте struct * n = malloc (sizeof * n * 10); - Дэвид С. Ранкин

Другой вариант: создание 10 элементов напрямую ... Предполагается, что узел выглядит так:

struct node
{
    Data data;
    node* next;
};

Тогда вы получите 10 элементов Data просто на

Data* allData = new Data[10]; // again using the C++ way...

У подхода C ++ есть еще одно преимущество: элементы в массиве уже инициализируются при вызове конструктора по умолчанию (для примитивных типов данных см. здесь ).

0 голосов
/ 28 апреля 2018

Поскольку ваша переменная n является локальной для тела цикла, она создается в начале каждой итерации и уничтожается в конце каждой итерации.

Очевидно, компилятор решил использовать одно и то же хранилище для каждого воплощения n, поэтому все они имеют один и тот же адрес памяти.

Обратите внимание, что &n является адресом n, а не его содержимым. Вам даже не нужно инициализировать его. Ваш звонок на malloc не имеет значения.

Если вы хотите увидеть значение n, вам нужно удалить &.

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