0

我一直在寻找,找不到这样的东西。现在,我不会对我的整个程序感到厌烦。它非常长。但是,这是您的基本概述:

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

非常感谢,所有帮助的人!:)

4

3 回答 3

5

您滑过数组边界,导致损坏:

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

您的ij索引不得达到 4。

于 2013-02-23T09:03:14.700 回答
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 报告的所有问题后仍表现异常,请告诉我们。

于 2013-02-23T08:55:34.647 回答
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。

于 2013-02-23T09:08:35.390 回答