2014-08-27 109 views
2

我正在学习C++并试图解决编程挑战中的问题。我一直在解决跳投问题。为了说明问题,我的程序运行了,但在输入第一行并得到输出后,出现了分段错误。这里是我的代码:获取分段错误错误C++

#include <iostream> 
    #include <cmath> 

    using namespace std; 

    bool is_jolly(int *list, int cap, bool* container){ 
     int difference = 0; 
     for(int i=0; i<cap-1; i++){ 
      difference = list[i] - list[i+1]; 
      if(abs(difference) < cap && abs(difference) >= 1 && container[difference] == false){ 
      container[difference] = true; 
      continue; 
      } 
      else return false; 
     } 
     return true; 
    } 

    int main(){ 
    int n; 
    bool used[30001]; 
    while(cin >> n){ 

     int * num_list = new int[n]; 
     for(int i=0; i<n; i++){ 
       cin >> num_list[i]; 
       used[i+1] = false; 
     } 
     if(is_jolly(num_list,n,used)) 
       cout << "Jolly" << endl; 
     else cout << "Not Jolly" << endl; 

     delete[] num_list; 
    } 

    return 0; 
    } 
+2

你是否尝试用调试器进入你的代码? – taocp 2014-08-27 18:39:39

+3

开始使用'std :: vector'而不是原始数组,你会看到所有的seg错误消失! – CoryKramer 2014-08-27 18:40:07

+6

您应该阅读Eric Lippert撰写的[本博客文章](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/),了解如何调试小程序,如应用程序和应用程序那里描述的技术。 – 2014-08-27 18:40:08

回答

2

如果差异可以是负的(例如,在输入2 0 10000)然后container[difference]使用负指数(如container[-10000]),这将导致段错误

for(int i=0; i<cap-1; i++){ 
     difference = list[i] - list[i+1]; 
     if(abs(difference) < cap && abs(difference) >= 1 && container[difference] == false){ 

而使用:

for(int i=0; i<cap-1; i++){ 
     difference = abs(list[i] - list[i+1]); 
     if(difference < cap && difference >= 1 && container[difference] == false) { 

....如果这是你想要的(我不知道是什么目的)

+0

一旦'差异'是积极的,通过代码从OP开始,整个if()语句可能是这样的:'if(difference PaulMcKenzie 2014-08-27 19:09:24

+0

@PaulMcKenzie:但有'否则返回false' – firda 2014-08-27 19:10:54

+0

是的,现在看到它。 – PaulMcKenzie 2014-08-27 19:15:11