C ++指针节点

当我以这种方式写下我的代码时,它会返回奇怪的错误。

struct Student{
    int val;
    Student* next;
    Student(int a){
        val = a;
        next = NULL;
    }
};
int main(){
Student begin(0);
Student *head = &begin;
Student *pointer = head;
for(int i=0;i<3;i++){
    pointer->val = i;
    Student next(0);
    pointer->next = &next;
    pointer = pointer->next;
}

while(head != NULL){
    cout<< head-> val<<endl;
    head = head ->next;
}
}

在我以这种方式改变循环之后,它就可以工作。

for(int i=0;i<3;i++){
    pointer->val = i;
    pointer->next = new Student(0);
    pointer = pointer->next;
}

为什么会发生? 这两种方式初始化下一个节点有什么不同?


您正在设置节点以指向本地堆栈变量,随着您进入for循环的下一次迭代,该变量正在被破坏。

您对new Student使用通过进行堆分配来解决这个问题

很多关于堆栈vs栈堆内存堆栈内存的讨论


当你宣布这样的学生

Student next(0);

它在堆栈上分配临时内存,只应在该块中认为可用。

当你使用new你在可以在任何地方使用的堆上分配内存。 注意内存泄漏并始终定义析构函数。

new Student(0);

for(int i=0;i<3;i++){
   pointer->val = i;
   Student next(0);
   pointer->next = &next;
   pointer = pointer->next;
}

您正在自动存储上创建对象学生(通常作为堆栈实现)。 然后你在链表中存储一个指向这个对象的指针。 当'学生'超出范围时,对象被删除。 现在你的指针是一个悬挂指针。 取消引用该指针现在是未定义的行为。

pointer->next = new Student(0);

在动态存储上创建(通常以堆的形式实现)。 这个对象将一直存在,直到你告诉它死(删除它)。

我建议你阅读C ++中堆栈/堆之间的差异。 如果你想学习C ++,这是一个非常重要的话题。

另外,确保你删除了任何新的对象! 如果你不这样做,你的程序中会出现内存泄漏。

链接地址: http://www.djcxy.com/p/79795.html

上一篇: C++ Pointer node

下一篇: What's the difference between an array and a pointer in C exactly?