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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么此代码导致分段错误?相关的知识,希望对你有一定的参考价值。

我正在编写一个简单的模拟器,用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("
");
    }
    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()函数导致了分段错误,我不知道为什么。

答案
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){

以上是关于为什么此代码导致分段错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥此代码部分返回“分段错误”错误?

什么原因导致C中出现分段错误(核心转储)?

为啥这个字符串反转 C 代码会导致分段错误? [复制]

为啥此代码会为大输入提供分段错误

大量对象导致分段错误

为啥在此代码中调用虚拟方法时会出现分段错误?