【问题标题】:Segmentation fault in C (Trying to make a chess game)C中的分段错误(尝试制作国际象棋游戏)
【发布时间】:2021-06-21 13:09:09
【问题描述】:

我正在用 C 语言下棋,但在我的布尔检查中遇到了分段错误(这应该让程序查看是否有玩家在检查中)。我认为这与我的 S 变量有关,但我无法真正理解发生了什么。如果有人能告诉我是什么导致了分段错误,那就太好了。

谢谢! 爱德华

bool check(void){

    //printf("ran check\n");
for(int x3 = 0; x3 < 8; x3++)
{
    //printf ("here\n");
    for(int y3 = 0; y3 < 8; y3++)
    {
        switch(board[x3][y3])
        {
            int s = 0;
            case 1:
            printf("pawn");
            usleep(50000);
            if (board[x3 - 1][y3 + 1] == 11 || board[x3 + 1][y3 + 1 ] == 11)
            {
                printf("in check");
                return true;
            }
            case 2:

            printf("rooktest");
            do{
              s = s + 1;
              if (board[x3+s][y3] == 11){
                  printf("Rook in check");

                  return true;
              }
            } while (board[x3+s][y3] == 0 || board[x3+s][y3] == 11);


        }
        }
    }

【问题讨论】:

  • board[x3 - 1] 例如,如果x3 == 0 是不好的。
  • ... 与 board[x3+s][y3] 类似,在 while 循环中更是如此,该循环递增 s 并在找到的 content 处终止。
  • 注意编译器警告:warning: statement will never be executed [-Wswitch-unreachable] for int s = 0;
  • 我建议你使用enums 来表示片段或状态,而不是像11 这样的硬编码。
  • 发布的代码几乎没用。请发布minimal reproducible example,以便我们重现问题并帮助您调试。

标签: c segmentation-fault


【解决方案1】:

您的董事会在哪里定义?我假设是在功能块之外的某个地方定义的全局二维数组。我需要更多上下文,但我可以说:

在第一个if中,在外部循环的第一次迭代中,当x3=0时,导致访问board[-1],这是一个分段错误候选操作,与上一次迭代导致访问board[相同8]。一般来说,我认为当 x3 为 0 或 7 并且 y3 为 0 或 7 时,您正在冒险访问。

我建议使用 -g 标志进行编译,然后使用 gdb a.out 运行程序并检查在运行时哪些值占用了变量。

【讨论】:

  • 我不明白 -g 标志是什么。你能澄清一下吗?我正在使用 ide.cs50 来编译我的程序。
  • -g 标志是您提供给编译器的选项。它使您能够在 gdb 调试器中运行程序。这个工具可以让你把点放在程序在运行时停止的地方,并从你那里接受一些命令,比如 print x3 来查看变量的值是什么。理想情况下,您应该在崩溃之前找到程序的变量状态,然后推断导致它崩溃的原因。
  • 发布完整的代码,我会在我的电脑上运行它并自己调试,看看发生了什么,然后我可以帮助你=)
  • 请使用 Markdown 格式化代码(例如board[-1])。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多