2013-02-23 159 views
0

我一直在寻找,找不到像这样的东西。现在,我不会让你看到我的整个节目。这是非常漫长的。但是,这里是您的基本概述:C++中的神秘分割错误?

int main() 
{ 
    int i=0; 
    int h=5; 

    cout << "h(IS) = " << h << endl; 

    cout << "testing comment."; 

    while(i < 10) 
    { 
    cout << "I'm in the loop!"; 
    i++; 
    } 

    return 0; 
} 

看起来不错,对不对?好的,这是问题所在。我运行它,并且出现分段错误。最奇怪的部分是我得到它的地方。该测试评论甚至不打印。哦,如果我在循环之前注释掉所有的行,我仍然会得到这个错误。

所以,这里是我的输出,让你明白:

h(IS) = 5 
Segmentation fault 

我完全,彻底,困惑。在我的程序中,h调用一个函数 - 但是注释掉打印h和函数调用的行都没有效果,事实上,它所做的只是在打印h行过去的行上出现了分段错误。

什么是造成这种故障?我可以做什么来测试它来自哪里?

保持你的答案简单的请,我只是一个初学者相比,这里大多数人:)

注:我可应要求提供我完整的代码,但它是600线长。

编辑:我已经贴在这里真正的代码:http://pastebin.com/FGNbQ2Ka

原谅怪异的评论所有的地方 - 和阵列。这是一个学校任务,我们必须使用它们,而不是指针。我们的目标是打印解决方案到15-Puzzle。现在是凌晨1点,所以我不打算在整个事情中解决我恼火的评论。

我最近感到恼火,因为我认为这是在那里的东西,所以第一次印刷整个评论出来......但没有......它不是。我仍然有错。只是没有打印。

对于那些有兴趣,我的输入信息是0 6 2 4 1 10 3 7 5 9 14 8 13 15 11 12

谢谢这么多,每个人是帮助! :)

+3

嗯,它适用于我。没有问题不在您发布的代码中。 (如果你的代码太长,可能会在pasteit或其他东西上发布,并提供一个链接 – phoeagon 2013-02-23 08:50:52

+2

注意:因为你没有使用endl/flush刷新,你可能根本没有看到输出 – Aleph 2013-02-23 08:51:05

+1

在调试器中运行你的程序,它会停止在发生分段错误的地方,然后它将允许你检查函数调用堆栈,看看你是如何在那里结束的,然后让你走上调用堆栈,这样你就可以看到你的代码,然后你可以检查变量看看有什么可能导致它 – 2013-02-23 08:51:50

回答

0

valgrind是一个很好的调试内存访问问题的工具。在Linux上使用非常简单。只要安装G ++和Valgrind的,然后运行(不$标志):

$ g++ -g -o prog prog.cpp 
$ valgrind ./prog 

这将打印内存访问问题非常详细的错误信息,源代码行数。如果这些仍然对你没有意义,请发布完整的源代码(prog.cpp)和valgrind的完整输出。

我为你运行Valgrind的,它的输出是在这里:http://pastebin.com/J13dSCjw

看来你使用一些价值你没有初始化:

==21408== Conditional jump or move depends on uninitialised value(s) 
==21408== at 0x8048E9E: main (prog.cpp:61) 
... 
==21408== Conditional jump or move depends on uninitialised value(s) 
==21408== at 0x804A809: zero(int (*) [4], int (*) [4], int*, int, int, int, int, int, int) (prog.cpp:410) 
==21408== by 0x804A609: lowest(int (*) [4], int (*) [4], int, int, int, int, int, int) (prog.cpp:354) 
==21408== by 0x804932C: main (prog.cpp:125) 
... 

要解决这些问题,添加代码它会初始化上面错误行中描述的变量(例如第61,410行),然后重新编译,然后再次使用valgrind重新运行,直到所有错误消失。

如果你的程序甚至通过固定的valgrind报告的所有问题后,古怪的行为,请告诉我们。

+0

错,-1。 Valgrind报告了技术问题。您提出的解决方案不正确。例如,在第61行中,未经初始化的价值使用是由于访问不受限制的地址。它不应该被初始化,而不能被访问。 – SomeWittyUsername 2013-02-23 09:08:19

+0

valgrind输出的错误结论。这些问题很容易找到,通过简单的检查代码来完成一个纸质记录。 – diverscuba23 2013-02-23 09:10:41

5

你滑过数组边界,从而导致腐败:

for (i=0; i<=4; i++) 
{ 
    for (j=0; j<=4; j++) 
    { 
     if (cur[i][j] == 0) 
     { 
      row = i; 
      col = j; 
     } 
    } 
} 

ij指数不能达到4

0

行57 - 67:

for (i=0; i<=4; i++) 
{ 
    for (j=0; j<=4; j++) 
    { 
    if (cur[i][j] == 0) 
     { 
      row = i; 
      col = j; 
     } 
    } 
} 

至少一个你的错误是在这段代码中,cur声明为int cur [4] [4];这意味着当j == 4时(以及当i == 4时),您不在数组的范围内(以及您在某些内存中,但不是全部内存),有效值将为0 - 3。