【问题标题】:C Recursion segmentation faultC 递归分段错误
【发布时间】:2018-03-30 22:05:55
【问题描述】:

我是 C 新手,正在尝试做一个迷宫问题,其中 0 和字母是通过点,而 1 是障碍。

我的 2D 迷宫数组低于起点在 (0,4) 的位置,每次我必须检查 4 个方向(N、S、E、W)时,我也有路径数组(最初包含“0”作为字符),我将把路线作为“R”,这也是相同的大小:

1111S11110       
0000010001
110100010d
t001111110
0100000001
0111111101
1111111101
00000D01T1
0111110001
0000E01110

我正在使用递归解决方案进行寻路,总共使用以下 3 个函数:

int isSafe(char Mazearray[matrixSize][matrixSize],int x,int y){
    if(x >= 0 && x < matrixSize && y >= 0 && y < matrixSize && Mazearray[x][y] != '1'){
        return 1;
    }
    return 0;


}

void MazeSolution(char Mazearray[matrixSize][matrixSize],int x,int y,char pathArray[matrixSize][matrixSize]){
    if(recursiveMaze(Mazearray,x,y,pathArray) == 0){
        printf("There does not exist a possible solution!!!");
    }
    else{
        int i,j;
        for (i = 0; i < matrixSize; ++i){
            for (j = 0; j < matrixSize; ++j){
                printf("%c",pathArray[i][j]);
            }
        printf("\n");
        }
    }
}

int recursiveMaze(char Mazearray[matrixSize][matrixSize],int x,int y,char pathArray[matrixSize][matrixSize]){
    if(x == exitX && y == exitY){
        pathArray[x][y] == 'E';
        return 1;
    }
    // check if the coordinate is safe to go(not 1)
    if(isSafe(Mazearray,x,y) == 1){
        pathArray[x][y] == 'R';
        // Move North
        if(recursiveMaze(Mazearray,x-1,y,pathArray) == 1){
            return 1;
        }
        // Move South
        if(recursiveMaze(Mazearray,x+1,y,pathArray) == 1){
            return 1;
        }
        // Move East
        if(recursiveMaze(Mazearray,x,y+1,pathArray) == 1){
            return 1;
        }
        // Move West
        if(recursiveMaze(Mazearray,x-1,y-1,pathArray) == 1){
            return 1;
        }
        pathArray[x][y] == '0';
        return 0;
    }
    return 0;
}

当我运行MazeSolution() 时,程序以错误代码 255 和分段错误终止。当我调试时,问题出现在recursiveMaze() 函数中。

因此,从第一个 if 语句开始,它没有执行,另一个问题是它在南控制点和北控制点之间来回。

【问题讨论】:

  • 用 -g 编译并在 gdb 下运行(asumming 在 linux 上)。这至少会显示失败的行
  • 你的“西”是错误的。 y轴要严格调整;不是 x。 x-1,y-1 实际上是对角线移动。无论如何,包括构建矩阵的代码;实际上是演示您的问题的最小的完整示例。如果您对加载数组和/或对您显然正在使用的四个全局变量进行初始化的代码感到厌烦,那么阅读此代码将毫无意义。
  • 你确定你需要最后一个 return 0....可能是 return 1 吗? (因为什么都没有发生所以一切都很好?)
  • pathArray[x][y] == 'E'; 应该做什么?如果要分配,应该是=。如果要进行比较,则需要在 if 测试中。
  • 没有什么可以阻止无限递归。当你测试北时,它会测试南,它会回到同一个地方,然后他们会像这样来回走动。

标签: c recursion segmentation-fault


【解决方案1】:

这是一个导致无限循环的调用序列:

recursiveMaze(M, x, y, p)
   recursiveMaze(M, x-1, y, p)
       recursiveMaze(M, x-1, y, p) -> run to completion
       recursiveMaze(M, x+1, y, p) -> infinite loop

它是无限的,因为在第二次递归调用中,您将在第一次递归调用中递减的值递增回,这会将您带回到与初始调用相同的状态。

【讨论】:

    猜你喜欢
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 2019-05-26
    相关资源
    最近更新 更多