用户定义的链表从函数返回指针

User defined linked list returning pointer from function

本文关键字:函数 返回 指针 链表 定义 用户      更新时间:2023-10-16

我知道不久前我问了一个类似的问题,但仍然不起作用。很抱歉重复,我只是不确定为什么它不起作用。我创建了自己的链表(不使用stl库),我已经设置好了我的类,并按照我想要的方式完美地工作。我遇到的问题是,当我使用一个函数来填充列表时,会得到一个引用。在我的main中,我调用用于填充列表的函数bookSetUp()。我使this函数等于一个临时指针。(这是代码)
Main.cpp

Book* temp = bookSetUp();
while(temp!=NULL)
{
    cout<<temp->getName()<<endl;
    cout<<temp->getAuthor()<<endl;
    cout<<temp->getISBN()<<endl;
    temp = temp->getNext();
}

bookSetUp()位于另一个名为functions.cpp的.cpp文件中(我已经测试了这两个.cpp之间的链接)
函数.cpp
Book* bookSetUp()
{

//The items that populate the list
Book a("A Tale of Two Cities", "Charles Dickens", 1203456, true);
Book b("Lord of the rings", "J.R.R Tolkein", 123456, true);
Book c("Le Petit Prince", "Antoine de Saint-Exupéry", 123457, true);
Book d("And Then There Were None", "Agatha Christie", 123458, true);
Book e("Dream of the Red Chamber","Cao Xueqin",123459, true);
Book f("The Hobbit","J.R.R Tolkein",123467, true);
a.setPrev(NULL);
a.setNext(&b);
b.setPrev(&a);
b.setNext(&c);
c.setPrev(&b);
c.setNext(&d);
d.setPrev(&c);
d.setNext(&e);
e.setPrev(&d);
e.setNext(&f);
f.setPrev(&e);
f.setNext(NULL);
Book* temp = &a;
return temp;
}

正如你所看到的,我试图返回一个指向列表中第一个项目的指针,以便main可以访问它。我的book类有属性:字符串名称、字符串作者、int isbn和bool可用性
该程序崩溃,出现"bookRepository.exe中0x00B16886处的未处理异常:0xC0000005:读取位置0xCCCCCD04的访问冲突。"这意味着它没有从bookSetUp()函数中获取值
同样在调试器中,int ISBN返回,但不返回字符串或布尔
有人知道为什么不起作用吗?如果可以的话,这将是一个巨大的帮助!

这是新手的一个常见误解,他们并不真正理解指针应该如何使用。

一步一个脚印。

  1. 在书本设置中,可以创建6个书本对象。

  2. 您可以设置各种指针,特别是将temp设置为a的地址书

  3. 退出功能手册Setup。

  4. 此时,所有书籍对象都已销毁

  5. 因此,您从bookSetup返回时带有一个指向已销毁对象的指针。

  6. 因此,当您尝试使用该指针时,您的程序将崩溃。

这种方法不起作用。你需要学习另一种叫做"动态分配"的技术。这将使用new创建图书。动态创建的对象不会自动销毁,因此对于链表,您确实需要使用动态分配。

例如

Book* a = new Book("A Tale of Two Cities", "Charles Dickens", 1203456, true);

是的,我看得出来。

在c++中,对象保存在堆中。当函数超出作用域时,将释放(删除)保存在堆中的变量。

你的程序中的问题是:

bookSetup函数正在堆上创建对象然后它返回对这些对象的引用(内存中的地址)。但是当函数结束时,堆中的所有对象都将被删除。因此,您返回一个指向零的地址。

为了解决这个问题,您需要将这些对象保存在堆栈中,而不是堆中。

要做到这一点,您可以使用关键字"new"(在堆栈上分配空间的"new"关键字)

如果我记得这是语法:

Book* a = new Book("A Tale of Two Cities", "Charles Dickens", 1203456, true);
Book* b= new Book("Lord of the rings", "J.R.R Tolkein", 123456, true);
Book* c= new Book("Le Petit Prince", "Antoine de Saint-Exupéry", 123457, true);
Book* d= new Book("And Then There Were None", "Agatha Christie", 123458, true);
Book* e= new Book("Dream of the Red Chamber","Cao Xueqin",123459, true);
Book* f= new Book("The Hobbit","J.R.R Tolkein",123467, true);