为什么此代码导致分段错误?
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){
以上是关于为什么此代码导致分段错误?的主要内容,如果未能解决你的问题,请参考以下文章