2016-09-06 3 views
-2

В настоящее время я делаю удар по Project Euler #9 и сталкиваюсь с ошибками сегментации. Эти segfaults происходят только с каждого третьего-четвертого раза, когда я запускаю программу. Может ли кто-нибудь объяснить, почему это может быть так и, что более важно, почему это не segfault (или работа) каждый раз вместо этого?Несогласованные ошибки сегментации во время выполнения

Я определил segfault в начале второго цикла while, но до сих пор не могу определить основную причину.

#include <iostream> 
#include "LinkedList.h" 

using namespace std; 

int main(){ 
    int square, sum, answer = -1; 
    int start = 1; 

    LinkedList tripletChoices;  

    while (square<=1000){ 
     //create new node 
     node * factor = new node; 
     factor->root = start; 
     square = start*start; 
     factor->square = square; 

     //insert into list 
     if (square<=1000) tripletChoices.insertNode(factor); 

     start++; 
    } 

    node * a_factor = tripletChoices.head; 

    /** segfaults just after this ***********************/ 
    cout<<"before segfault" << endl; 

    while(a_factor->next!=NULL){ 

     cout<<"after segfault" << endl; 

     node * b_factor = a_factor->next; 

     while(b_factor->next!=NULL){ 
      sum = a_factor->square + b_factor->square; 

      cout<<"A: " << a_factor->square << " B: " << b_factor->square<< " sum:" << sum <<endl; 

      node * c_factor = tripletChoices.head; 

      while(c_factor->next!=NULL){ 

       if (sum == c_factor->square){ 
        if ((a_factor->root + b_factor->root + c_factor->root)==1000){ 
         answer = a_factor->root * b_factor->root * c_factor->root; 
         break; 
        } 
       } 

       c_factor = c_factor->next; 
      } 

      b_factor = b_factor->next; 
     } 

     a_factor = a_factor->next; 
    } 

    cout<<"Answer: " << answer << endl; 
} 

остальная часть моего кода (если применимо):

LinkedList.h

#ifndef LinkedList_h 
#define LinkedList_h 

struct node{ 
    int root; 
    int square; 
    node *next; 
}; 

class LinkedList{ 
    public: 
     node * head; 
     int listLength; 

     //default constructor creates head node 
     LinkedList(); 

     //setter method 
     bool insertNode(node * newNode); 

     //destructor de-allocates memory used by the list 
     ~LinkedList(); 
}; 

#endif 

LinkedList.cpp

#include "LinkedList.h" 
#include <iostream> 

//Default Constructor - initilizes list with head node 
LinkedList::LinkedList(){ 
    head = NULL; 
    listLength = 0; 
} 

// setter method for inserting a new node 
// inserts new node at the head of the list 
bool LinkedList::insertNode(node * newNode){ 
    newNode->next = head; 
    head = newNode; 
    listLength++; 
    return true; 
} 

//Destructor de-allocates memory used by list 
LinkedList::~LinkedList(){ 
    node * p = head; 
    node * q = head; 

    while(q){ 
     p = q; 
     q = p->next; 
     if (q) delete p; 
    } 
} 
+6

Неопределенное поведение - неопределенное поведение – bolov

+0

Ошибка сегментации является следствием [неопределенного поведения] (https://en.wikipedia.org/wiki/Undefined_behavior), открытого вашим кодом. И поскольку это не определено, ну, это не соответствует никакому правилу. – axiac

+0

Я идиот. спасибо – Geebs

ответ

2

Неопределенное поведение из-за доступа к локальной переменной неинициализированный

Вы обращаетесь к неинициализированной переменнойsquare перед тем, как ввести while цикл, чтобы он мог или не мог войти в цикл while. Таким образом, tripletChoices.head может быть или не быть не нулевым, так как вы не можете быть уверены, произошла бы какая-либо вставка или нет!

Таким образом, разыменование null, оцененное a_factor в while(a_factor->next!=NULL), вызовет SegFault.

Смежные вопросы