2010-11-01 32 views
1

嘿傢伙。這是一個非常簡單的問題,我敢肯定,但是我會像往常一樣讓自己糾結在C引用/指針中。我正在嘗試使用一系列鏈接列表來構建...排序隊列。基本上,我有一個結構,其內容和指向下一個元素的指針。我也有一個指向第一個和最後一個元素的指針。然後我有一個循環,將建立'排序'。我的問題是,要麼我的邏輯失敗,我沒有初始化隊列權限,或者我對C結構的知識失敗(這很可能),我最終只是創建一個結構並不斷提及它。未能建立「類隊列」結構 - 結構聲明存在問題?

我的測試代碼如下:

#include <stdio.h> 

struct test { 
    int contents; 
    struct test *next; 
}; 

main() { 

    struct test *first = NULL; 
    struct test *last = NULL; 
    int i; 

    for (i = 0; i < 2; i++) { 
     struct test tmp; 
     if (first == NULL) { 
      first = &tmp; 
      last = &tmp; 
     } else { 
      last->next = &tmp; 
      last = &tmp; 
     } 
     tmp.x = i; 
     tmp.next = NULL; 
    } 

    while (first != NULL) { 
     printf("%d\n", first->x); 
     first = first->next; 
    } 

    return 0; 

} 

運行此,我得到的第一個似乎指向一個測試結構有「1」,因爲它是「X」變量中的值輸出 - 所以不是我想要的最初一個。那麼,我是否在邏輯上失敗了,還是我沒有理解如何在循環中聲明新的單獨結構?或者兩者兼得?我很累...> _ <。

謝謝。

回答

2

你的問題是,你正在服用一個臨時變量,tmp的地址,並將其分配給其的生活比德暫時的,firstlast更長的指針。在循環的每一次迭代之後,臨時消失並繼續通過firstlast訪問它,導致未定義的行爲。

你需要爲了建立列表,像這樣以在堆上創建一個值(錯誤檢查略去了)

struct test* tmp = malloc(sizeof(struct test)); 

後來雖然你將需要經過和free所有的分配的節點。

+0

是的,我也這麼想。在C++世界花了很長時間,在那裏我一遍又一遍地被告知不要搶內存,因爲它是死亡......謝謝你。 – Stephen 2010-11-01 20:35:04