2013-05-11 132 views
3

我正在爲自己實現一個跳過列表,並且我遇到了一些C++問題。 我有兩種結構:返回指向結構體並訪問其字段的指針C++

  1. 的skiplist的節點 - 它保持其int值,和一個指針指向其他節點的數組。

    struct node{ 
        int val; 
        node** next; 
    }; 
    
  2. 跳過列表,其中包含指向列表頭部和尾部的指針(標記)。

    struct skiplist{ 
        node *head, *tail; 
    }; 
    

另外,我有,它返回一個指向skiplist結構(I使用該函數來初始化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()功能,但如果我想引用T中的skiplist他主要()通過訪問skiplist->tail該程序崩潰。 我一直在尋找相關的帖子,但他們沒有幫助我。

如上所述in a similar post我不應該遇到晃動指針,因爲我使用new運算符來分配結構。 我將是任何提示感謝;)

+1

你不''從'createSkiplist()'返回'l'。 – 2013-05-11 09:47:14

+0

打開編譯器警告,並停止浪費你的時間和其他人的時間。編譯器會告訴你關於丟失的回報。 – 2013-05-11 10:24:06

回答

5

第一個問題:

不必返回從createSkipList()任何東西,這意味着你的程序未定義的行爲。添加return聲明:

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

每款C++ 11標準的6.6.3/2:

[...]流下的函數到底是相當於一回沒有價值;這會導致在值返回函數中出現未定義的 行爲。

問題二:

以類似帖子中提到的,因爲我使用new運算符來分配結構我should't遇到懸擺指針[...]

不幸的是,你確實會遇到晃來晃去的指針。正如Angew in the comments提到的,你在這裏做什麼:

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

是創建一個本地數組對象,讓listHead->next點到它的第一要素,沒有考慮到數組(以及對象包含)將在createSkipList()返回時銷燬 - 自動存儲持續時間的對象在超出範圍時會被銷燬。

此外,作爲一般建議,考慮使用智能指針進行所有權建模,而不是通過原始指針newdelete進行手動內存管理。

+1

更不用說'listHead-> next'被設置爲指向一個局部變量,並且一旦函數退出就會變得懸而未決。 – Angew 2013-05-11 09:51:35

+0

@Angew:正確,我停在第一個問題;)謝謝你提到它,我將它添加到答案 – 2013-05-11 09:52:26

+0

@第一個問題 我不夠注意在代碼片段中省略return語句。當然你是對的,並感謝你對此發表評論。 @第二個問題: 我改變了創建數組的行,現在它工作正常。 ) 如果有人遇到類似的問題: 'node ** headNext = new node * [MAX_LEVEL];' 現在在函數退出後數組不會丟失。 – 2013-05-11 11:10:17