2014-02-06 62 views
-4

我一直都在獲得Visual Studio和G ++我試圖GDB但並未從中錯誤列表appened功能

視覺工作室=未處理的異常在0x00CD464F在array2.exe得到任何有用的錯誤:0000005:訪問衝突閱讀位置0xCCCCCCCC。

gdb given =程序接收到的信號SIGSEGV,分段錯誤。 370x000000010040118f列表::追加(此= 0x23aa80,X = 6)的main.cpp:61

 #include <iostream> 
#include <stdlib.h> 
// "arraylist.h" 
#include <new> 
//#include "myList.h" 
using namespace std; 


struct node{ 
    int data; 
    node* next; 
}; 
struct list{ 
    node* head; 
    void append(int x); 
}; 
int main() 
{ 
    list L; 
    L.append(6); 
    node* cur = L.head; 
    while (cur->next != 0) 
    { 
     std::cout << cur->data << std::endl; 
     cur = cur->next; 
    } 
    return 0; 
} 

void list::append(int x) 
{ 
    node* tmp = new node; 
    node* cur = head; 
    tmp->data = x; 
    tmp->next; 
    if (cur->data == 0) 
    { 
     head = tmp; 
    } 

    else{ 
     while (cur->next != 0) 
     { 
      cur = cur->next; 
     } 
     cur->next = tmp; 

    } 


} 
+1

你沒有得到有用的信息被隱式調用。 gdb說你在main.cpp的第61行有段錯誤。那是哪條線? – m24p

+0

可能是這樣的:'if(cur-> data == 0)' – m24p

+1

'tmp-> next;'嗯......啓用警告。您的編譯器會告訴您類似「代碼無效」的內容。 – WhozCraig

回答

2

一對夫婦的提示:

  1. 您還沒有初始化L.head(感謝@Alan斯托克斯)。

  2. 您尚未初始化tmp->next

  3. cur->data == 0不是檢查列表是否爲空的正確方法。

+1

另外你還沒有初始化'L.head'。 –

+0

現在不能upvote,最可能是正確的! –

+0

它確實充滿了頭腦......但這些應該是所有潛在的不速之客。 ---我非常喜歡'tmp-> next'語句。 – Xarn

0

你的代碼是無效的,因爲在創建

struct list{ 
    node* head; 
    void append(int x); 
}; 
int main() 
{ 
    list L; // <== head is not initialized. 

列表中的一個對象,您可以寫例如列表數據成員頭部未初始化

list L = { 0 }; 

或者

struct list{ 
    node* head = 0; 
    void append(int x); 
}; 
-1

in

if (cur->data == 0) 
{ 
    head = tmp; 
} 

您嘗試訪問新創建的list對象的頭部,這意味着你使用的是未初始化的指針。這意味着,無論何時解除引用,您都正在訪問未確定的內存部分,在這種情況下,您不會訪問這部分內容(這會導致訪問衝突錯誤)。我建議在結構構造函數中設置headNULL,並在每個試圖訪問它的方法中檢查頭是否爲NULL(在本例中爲list::append(int))。

list::list(){ 
    head = NULL; 
} 

這個空的構造,當您使用list L;