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

时间:2013-05-11 09:45:13

标签: c++

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

  1. skiplist的一个节点 - 它保存了int值,并指向指向其他节点的指针数组。

    struct node{
        int val;
        node** next;
    };
    
  2. 跳过清单,指向列表的头部和尾部(哨兵)。

    struct skiplist{
        node *head, *tail;
    };
    
  3. 另外,我有一个函数返回一个指向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,即访问skiplist->tail程序崩溃。 我一直在寻找相关的帖子,但他们没有帮助我。

    如上所述in a similar post我不应该经历悬空指针,因为我使用new运算符来分配结构。 我会很感激任何提示;)

1 个答案:

答案 0 :(得分:5)

第一个问题:

您没有从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->next指向它的第一个元素,而不考虑数组(以及它包含的对象)将被销毁一次{{ 1}}返回 - 具有自动存储持续时间的对象在超出范围时会被销毁。

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