C ++中的神秘分段错误?

时间:2013-02-23 08:47:26

标签: c++ segmentation-fault

我一直在搜索,找不到这样的东西。现在,我不会厌倦你的整个计划。这是非常长的。但是,这是您的基本概述:

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行。< / p>

造成这个错误的原因是什么?我能做些什么来测试它的来源?

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

注意:我可以根据要求提供完整的代码,但它长达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 个答案:

答案 0 :(得分:5)

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

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

您的ij索引不得达到4。

答案 1 :(得分: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报告的所有问题之后表现得很奇怪,请告诉我们。

答案 2 :(得分: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。 / p>