为什么此代码导致分段错误?

时间:2017-12-28 13:05:24

标签: c segmentation-fault

我正在编写一个简单的模拟器,用C中的泛滥填充算法将鸡蛋洒在锅里。所以锅是一个炭矩阵,'#'是他的墙,'。'意味着这个地方是空的,而'O'表示它有一个会溢出的蛋。
这是该计划应该做的一个例子。

10 10
..##......
.#O.#.....
.#..#..#..
..##..#.#.
.......#..
..#####...
..#...#...
..#...##..
...##..#..
....####..
⇨

..##......
.#OO#.....
.#OO#..#..
..##..#.#.
.......#..
..#####...
..#***#...
..#***##..
...##**#..
....####..

我写过:

#include <stdio.h>

void food_fill(int,int,char [1000][1000],int,int,char);
int main(){
    int row,col,rows,cols;
    scanf("%d %d",&rows,&cols);
    getchar();
    char matrix [rows][cols];
    for(row = 0;row < rows;row++){
        for(col = 0;col < cols;col++){
            scanf("%c",&matrix[row][col]);

        }
        getchar();
    }
    int foodX=0,foodY=0;
    char foodChar='s';
    for(row=0;row<rows;row++){
        for(col = 0;col < cols;col++){
            if(matrix[row][col] == 'O'){
                foodX = row;
                foodY = col;
                foodChar = matrix[row][col];
            }
        }
    }
    food_fill(rows,cols,matrix,foodX,foodY,foodChar);
    for(row = 0;row < rows;row++){
        for(col = 0;col <cols;col++){
            printf("%c",matrix[row][col]);
        }
        printf("\n");
    }
    return 0;
}
void food_fill(int rows,int cols,char matrix[rows][cols],int foodX,int foodY,char foodChar){
    int r=rows,c=cols;
    if(matrix[foodX][foodY] == '#')return;
    if(foodX < 0 || foodX >= rows || foodY < 0 || foodY >= cols)return;
    matrix[foodX][foodY] = foodChar;
    food_fill(r,c,matrix,foodX+1,foodY,foodChar);
    food_fill(r,c,matrix,foodX-1,foodY,foodChar);
    food_fill(r,c,matrix,foodX,foodY+1,foodChar);
    food_fill(r,c,matrix,foodX,foodY-1,foodChar);

}

尚未完成,但food_fill()函数导致分段错误,我不知道原因。

1 个答案:

答案 0 :(得分:0)

if(matrix[foodX][foodY] == '#')return;
if(foodX < 0 || foodX >= rows || foodY < 0 || foodY >= cols)return;

订单错了。因此,您正在访问无效索引。给你分段错误。正确的是

if(foodX < 0 || foodX >= rows || foodY < 0 || foodY >= cols)return;
if(matrix[foodX][foodY] == '#')return;

此外,还有许多级别的错误。

由于重复的类似调用,您正在进行无限循环。

int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};

void food_fill(int rows,int cols,char matrix[][cols],int foodX,int foodY,char foodChar){

    matrix[foodX][foodY] = foodChar;

    for(int i=0;i<4;i++){
        if( foodX+dx[i]>=0 && foodX+dx[i]<rows && foodY+dy[i] >=0 && foodY+dy[i]<cols && matrix[foodX+dx[i]][foodY+dy[i]] != '#' && matrix[foodX+dx[i]][foodY+dy[i]]!=foodChar){
            food_fill(rows,cols,matrix,foodX+dx[i],foodY+dy[i],foodChar);
        }
    }
}

主要条件变化是

  if( foodX+dx[i]>=0 && foodX+dx[i]<rows && foodY+dy[i] >=0 && foodY+dy[i]<cols && matrix[foodX+dx[i]][foodY+dy[i]] != '#' && matrix[foodX+dx[i]][foodY+dy[i]]!=foodChar){