2012-10-21 189 views
0

我已經做了這個程序,指針和函數應該是一個鏈表。我不斷收到「訪問衝突讀取位置0xcdcdcded」。在下面的最後一部分。我想這可能是因爲我沒有在下一次初始化,但我是新手,不知道該怎麼做。任何幫助是極大的讚賞。C鏈表訪問衝突

typedef struct temp 
{ 
    char name[20]; 
    char telephone[10]; 
    temp *next; 
} node; 


node* creation1() 
{  
    node *NEW = NULL; 
    NEW = (node*)malloc(sizeof(node)); 
    return NEW; 
} 

node* creation2() 
{ 
    node *start= NULL; 
    node *NEW = creation1(); 
    start= NEW; 
    return start; 
} 

node* creation3() 
{  
    node *NEW = creation1(); 
    node *current = NULL; 
    current=NEW; 
    return current; 
} 

void consult() 
{ 
    node *NEW= creation1(); 
    node *start= creation2(); 
    node *current = creation3(); 
    int exit; 
    printf("How many contacts do you wish to add? "); 
    scanf("%i",&exit); 

    for(int i=1; i<=exit; i++) 
    { 
     NEW = (node*)malloc(sizeof(node)); 
     current->next=NEW;     
     current = NEW; 
     fflush(stdin); 
     puts("NAME: "); 
     gets(NEW->name); 
     puts("TELEPHONE: "); 
     gets(NEW->telephone); 
     NEW->next=NULL; 
    } 

    current=start->next; 

    int i = 0; 
    do 
    { 
     i++; 
     current = current->next; //this is where it stops and gives me the access reading violation 
    }while (current != NULL); 
} 

int main(int argc, char** argv) 
{ 
    consult(); 
} 

回答

0

因爲這似乎是它可能功課,我不想透露太多,但你的基本問題是,你首先要創建一個開始節點與線路node *start= creation2();。在執行的這一點上,start->next的值是垃圾,可能是任何東西。

然後,在您的for循環中,根本不觸及節點start,這意味着start->next仍然可以是任何東西。

接下來,在行current=start->next;中,您將current設置爲start->next的垃圾值。

然後最後在行current = current->next;您正在解引用垃圾值並跳轉到內存中的隨機位置。一般來說,如果你有一個指針值(如start->next),並且你沒有很好的值來設置指針在你創建時的值,你應該把它設置爲NULL。然後,在取消引用值(使用->運算符)之前,應檢查->左側的變量是否等於NULL,如果是,則不要執行->操作。任何更具體的建議對我來說都很難,因爲代碼中沒有任何註釋來解釋應該發生的事情。