返回指向结构的指针并访问其字段 C++

Posted

技术标签:

【中文标题】返回指向结构的指针并访问其字段 C++【英文标题】:Returning a pointer to a structure and accessing its fields C++ 【发布时间】:2013-05-11 09:45:12 【问题描述】:

我正在为自己实现一个跳过列表,但在使用 C++ 时遇到了一些问题。 我有两个结构:

    skiplist 的一个节点 - 它保存它的 int 值,以及一个指向指向其他节点的指针数组的指针。

    struct node
        int val;
        node** next;
    ;
    

    Skiplist 包含指向列表头部和尾部(哨兵)的指针。

    struct skiplist
        node *head, *tail;
    ;
    

另外,我有一个函数,它返回一个指向skiplist结构的指针(我使用这个函数来初始化skiplist):

skiplist* createSkipList()
    skiplist* l = new skiplist;
    node* listHead = new node;
    node* listTail = new node;

    node* headNext[MAX_LEVEL]; //array of pointers
    listHead->next = headNext;

    for(int i=0; i<MAX_LEVEL; i++)
        listHead->next[i] = listTail;
    

    l->head=listHead;
    l->tail=listTail;

在我调用的 main() 函数中:

skiplist* skiplist=createSkipList();

createSkipList() 函数中一切正常,但如果我想引用 main() 中的跳过列表,即通过访问 skiplist-&gt;tail,程序会崩溃。 我一直在寻找相关的帖子,但他们没有帮助我。

正如in a similar post 提到的,我不应该遇到悬空指针,因为我使用new 运算符来分配结构。 如果有任何提示,我将不胜感激;)

【问题讨论】:

你不是return l; from createSkiplist() 打开编译器警告,停止浪费您和其他人的时间。编译器会告诉你缺少的返回值。 【参考方案1】:

第一个问题:

你没有从createSkipList() 返回任何东西,这意味着你的程序有未定义的行为。添加return 声明:

skiplist* createSkipList()
    skiplist* l = new skiplist;
    // ...
    return l;
//  ^^^^^^^^^

根据 C++11 标准的第 6.6.3/2 段:

[...] 从函数末尾流出相当于没有值的返回;这导致未定义 值返回函数中的行为。

第二个问题:

正如在类似帖子中提到的,我不应该遇到悬空指针,因为我正在使用 new 运算符来分配结构 [...]

不幸的是,您确实遇到了悬空指针。正如 Angew in the comments 所提到的,你在这里做什么:

node* headNext[MAX_LEVEL]; //array of pointers
listHead->next = headNext; 

是创建一个本地数组对象,让listHead-&gt;next指向它的第一个元素,而不考虑一旦createSkipList()返回,数组(以及它包含的对象)将被销毁- 具有自动存储期限的对象在超出范围时会被销毁。

此外,作为一般建议,考虑使用智能指针来建模所有权,而不是通过原始指针、newdelete 进行手动内存管理。

【讨论】:

更不用说listHead-&gt;next被设置为指向一个局部变量,一旦函数退出就会变成悬空的。 @Angew:正确,我在第一个问题上停了;)谢谢你提到它,我将它添加到答案中 @第一个问题我不够专心,在我的代码 sn-p 中省略了 return 语句。当然,您是对的,感谢您对此发表评论。 @第二个问题:我已经更改了创建数组的行,现在它工作正常。谢谢你们帮助我;)如果有人遇到类似的问题:node** headNext = new node*[MAX_LEVEL]; 现在函数退出后数组不会丢失。

以上是关于返回指向结构的指针并访问其字段 C++的主要内容,如果未能解决你的问题,请参考以下文章

C++指针问题,请问如何定义一个返回值为结构体指针数组的函数?

C++,成员函数返回对包含指向 const 对象的指针的向量的 const 引用

C ++在指向结构的指针中访问类数组指针

C++数组初始化方法

在 C++ 中使用指针的数组:访问返回的数组时出现分段错误

函数接受结构指针和返回结构指针有奇怪的行为?