2016-03-03 94 views
-3

下面的代码是我整个程序的一个片段。我定义的唯一的东西是构造函数(head = 0),析构函数和一个函数,用于创建一个包含20个值的链表。他们应该是随机的(我可以处理),但我需要先解决这个seg故障。帮帮我!对于节点为什么我会出现分段错误?

结构类型是:

struct ListNode 
{ 
    int value; 
    ListNode *next; 
}; 
ListNode *head; 

CODE:

void NumberList::buildSortedList(){ 
    ListNode *newNode; 
    int number = 1;  
    int count = 0;  
    head->value = number;  
    ListNode *p; 
    do{ 
     p = head;  
     while (p->next) { // traverse the list to the end to append new value 
     p = p->next;  
     newNode = new ListNode; 
     newNode->value = number; 
     newNode->next = NULL;  
     p->next = newNode;  
    }   
    }while (count < 19); 
    } 
+1

** - 1 **如果这是所有相关的代码,那么您将解除引用那个未初始化的head,一个不确定的值。根据您的想法下调您的想法,足以确定哪些代码是相关的。你应该总是发布一个*完整*但最小的例子。 –

+0

所以你在你的ctor中定义了'head = 0',然后你做'head-> value'?不知道会发生什么问题...... – Nacho

回答

0
while (p->next) { // traverse the list to the end to append new value 
    p = p->next; 

    newNode = new ListNode; 
    newNode->value = number; 
    newNode->next = NULL; 

    p->next = newNode; 

} 

应该是

while (p->next) { // traverse the list to the end to append new value 
    p = p->next; 
    } 

    newNode = new ListNode; 
    newNode->value = number; 
    newNode->next = NULL; 

    p->next = newNode; 
0

如果head是一个全局变量,它被初始化为NULL 。取消引用NULL是非法的。

您必须先将指向有效缓冲区的指针分配给取消引用它的有效缓冲区。

void NumberList::buildSortedList(){ 

    ListNode *newNode; 

    int number = 1; 

    int count = 0; 

    if (head == NULL) head = new ListNode; // add this line 
    head->value = number; 

    ListNode *p; 

    do{ 
     p = head; 

     while (p->next) { // traverse the list to the end to append new value 
     p = p->next; 
     } // move this in order not to break the list 

     newNode = new ListNode; 
     newNode->value = number; 
     newNode->next = NULL; 

     p->next = newNode; 


    }while (count++ < 19); // add ++ to avoid infinite loop 

} 
相关问题