2010-03-16 26 views
0

我在這段代碼中遇到了段錯誤,但我無法弄清楚爲什麼。我知道當指針爲NULL或指向隨機存儲器地址時會發生段錯誤。C++中出現分段錯誤,但爲什麼?

q = p; 
     while(q -> link != NULL){ 
      q = q -> link; 
     } 
     t = new data; 
     t -> city = cityName; 
     t -> latitude = lat; 
     t -> longitude = lon; 
     q -> link = t; 

這是錯誤時在控制檯實際上得到:

line 33: 2219 Segmentation fault sh "${SHFILE}" 
+3

@Carlos:爲什麼刪除所有代碼?正如我從你接受的答案中瞭解到的,其中一些*是相關的。 – 2010-03-16 17:55:26

回答

6

else子句中Database::add,你不設置t->link = NULL,所以它是未初始化。

您應該添加一個構造data初始化它的成員,或使用值初始化new,以確保一切正確初始化:

t = new data(); // note the parentheses 
3

這是可能的,這是因爲當你添加新的節點到列表的末尾:

else{ 
    q = p; 
    while(q -> link != NULL){ 
     q = q -> link; 
    } 
    t = new data; 
    t -> city = cityName; 
    t -> latitude = lat; 
    t -> longitude = lon; 
    q -> link = t; 
} 

你沒有設置t->link = NULL;

1

編譯-g作爲參數傳遞給克++

從命令行「GDB(二進制名)」

內部GDB,「運行」

然後,它會執行直到故障

類型「BT」 看到一個堆棧跟蹤

+1

對不起你不需要的東西。我會記得在未來不回答你的問題 – Mike 2010-03-16 17:26:26

+2

什麼告訴你他是誰低估了你? (不,它不是我的;)) – MetalMikester 2010-03-16 17:27:29

+5

我因爲答案而降低了評分。用戶似乎是一個初學者,可能不知道「堆棧跟蹤」。 B.用戶沒有從命令行運行,可能沒有使用gdb的經驗。 C.沒有說用戶安裝了GDB。 D.您沒有時間查看代碼並回答問題,只需輸入罐裝的響應等。 – 2010-03-16 17:30:28

3

您還沒有Database::add設置數據庫::數據::鏈接NULL

t = new data; 
    t -> city = cityName; 
    t -> latitude = lat; 
    t -> longitude = lon; 
    t -> link = NULL; 

編輯: 我會爲Database::data添加一個構造函數來初始化各個成員。例如:

class Database { 
    struct data { 
     data(): latitude(0.0), longitude(0.0), link(NULL) {} 
     ... 
    }; 
    ... 
}; 

然後你沒有未初始化的內存來擔心。

1

可能還有其他的問題,但這裏有一個:

else{ 
    q = p; 
    while(q -> link != NULL){ 
     q = q -> link; 
    } 
    t = new data; 
    t -> city = cityName; 
    t -> latitude = lat; 
    t -> longitude = lon; 
    q -> link = t; 
} 

你從來沒有t->link爲空,所以它充滿了垃圾。

1

您需要分配T的鏈接NULL:

else{ 
    q = p; 
    while(q -> link != NULL){ 
     q = q -> link; 
    } 
    t = new data; 
    t -> city = cityName; 
    t -> latitude = lat; 
    t -> longitude = lon; 
    t -> link = NULL; // add this 
    q -> link = t; 
} 
+1

呵呵,我們都在同一時間回答。 – 2010-03-16 17:37:33