C++指针不起作用

标签 c++ data-structures linked-list

我正在尝试使用 C++ 学习链表。这是我的代码:

#include<bits/stdc++.h>
using namespace std;

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

void show(node *head)
{
    node *n;
    n=head;
    while(n)
    {
        cout<<n->data<<' ';
        n=n->next;
    }
    cout<<endl;
}

void insert(node *list,int x)
{
    list->data=x;
    node *t=new node;
    list->next=t;
    list=t;
}
int main()
{
    node *head,*t,*list=new node;
    head=list;
    for(int i=0;i<10;i++)
    {
        insert(list,i+1);
    }
    show(head);
}

一开始我已经把head指向了内存列表指向的内存,但是insert调用了insert函数后,head指向了list的内存 指向,但它是否应该发生。 head 不是应该保持不变吗?

最佳答案

insert() 当在同一个 list 上重复调用时,会使 list->next 指向一个新的 node.

该新节点未初始化,因此取消引用其 next 指针(如发生在 show() 中)会产生未定义的行为。一旦代码具有未定义的行为,所有赌注都将取消 - 任何事情都可能发生。

最终效果是,由于 insert() 的行为方式,show() 将表现出未定义的行为。

由于 list 是按值传递的,因此在 insert() 中分配给它没有任何效果。该分配对 main() 不可见。

list->next指向的前一个节点也丢失了(未释放,不再可访问)。

main() 还使 list 未初始化,因此使用其成员(在 insert()show()) 导致未定义的行为,即使上述问题已修复。

关于C++指针不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38351107/

相关文章:

c++ - 在 C++ 项目中构建事件

java - 为什么我们需要在二叉树子类中进行前序、中序和后序遍历的字段?

java - toString 方法似乎只工作一次,即使它被调用多次

无法将新创建的链表分配给另一个变量

c - 使用 malloc (C89) 在 main() 之外初始化结构

c++ - OMSetRenderTargets 只呈现第一个提供的目标

c++ - 这会泄漏内存吗?我该如何预防?

c++ - 如何/在哪里获取 msvs 2008(32 位)编译器工具链的编译器而不安装 msvs2008

C# 在数据结构中存储数据

c++ - 关系应用程序数据的并发更新