Почему статическое распределение памяти не работает при объявлении узлов для создания списка ссылок - PullRequest
0 голосов
/ 24 февраля 2019
#include <iostream>
using namespace std;
struct node{
    int data;
    node* next;
    node(){}
    node(int data){
        this->data=data;
        this->next=NULL;
    }

};
node* createlinklist(){
    node*head=new node();
    int data;
    cout<<"Enter data and -1 to exit"<<endl;
    cin>>data;
    if(data!=-1){
        head->data=data;
        head->next=NULL;
    }
    node* it=head;
    cin>>data;
    while(data!=-1){
        node* temp;
        temp->data=data;
        temp->next=NULL;
        it->next=temp;
        it=it->next;
        cin>>data;
    }
    return head;
}
void print(node* head){
    while(head!=NULL){
        cout<<head->data<<"-->";
        head=head->next;
    }
    cout<<"NULL"<<endl;
}

Для кода выше, когда я динамически выделяю память для temp и делаю node * temp = new node ();список ссылок печатается отлично, но когда я делаю вышеописанное так, как я разместил код, он просто не работает после первого узла.Из всего моего изучения кажется, что динамическое распределение не должно иметь никакого значения в этом контексте, верно?Я не использую статически размещенные узлы вне области действия функции, поэтому я не понимаю, почему она не печатается, если я не использую динамическое выделение для температуры.

1 Ответ

0 голосов
/ 24 февраля 2019

Первая точка, это называется автоматическое распределение, а не статическое распределение.

Вторая точка, этот код является неопределенным поведением, поскольку он использует неинициализированный указатель

while (data != -1) {
    node* temp;
    temp->data = data;
    temp->next = NULL;
    it->next = temp;
    it = it->next;
    cin>>data;
}

Здесь temp не заданозначение, поэтому его использование temp->data является ошибкой.Это не имеет ничего общего с типами распределения.Проблема в том, что ничто не было выделено, каким-либо образом, для temp, чтобы указывать на.

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

while (data != -1) {
    node auto_node;
    node* temp = &auto_node; // a pointer to an automatically allocated object
    temp->data = data;
    temp->next = NULL;
    it->next = temp;
    it = it->next;
    cin>>data;
}

Этот код, скорее всего, вылетит при запуске.Причина в том, что вы используете auto_node объекты вне функции.Возможно, это ваше настоящее недоразумение.Хотя вы не используете объекты auto_node напрямую, вы сохранили указатели на эти объекты, все указатели next в вашем связанном списке указывают на эти автоматически распределенные узлы, которые не существуют вне вашей функции createlinklist.

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