所以我无法弄清楚为什么我的代码是核心转储。
这是我的代码..
void findMines(Board *b, int x, int y, int row, int column)
{
while(x != row && y != column)
{
if(b->boardSpaces[x][y].mineHere == '\n')
{
x = 0;
y++;
continue;
}
//The most hideous if statement ever.
if(b->boardSpaces[x][y].mineHere == 'M' || b->boardSpaces[x][y].mineHere == ' ' || b->boardSpaces[x][y].mineHere == '.' || b->boardSpaces[x][y].mineHere == '\n')
{
switch(b->boardSpaces[x][y].mineHere)
{
case 'M':
{
if(b->boardSpaces[x][y-1].ajacentMines == 0 || b->boardSpaces[x+1][y].ajacentMines == 0 || b->boardSpaces[x][y+1].ajacentMines == 0 || b->boardSpaces[x-1][y].ajacentMines == 0)
{
b->boardSpaces[x][y].mineHere = '.';
}
break;
}
case ' ':
{
break;
}
case '.':
{
break;
}
}
continue;
}else
{
switch(b->boardSpaces[x][y].ajacentMines)
{
case 0:
{
if(b->boardSpaces[x][y-1].mineHere == 'M')
{
b->boardSpaces[x][y-1].mineHere = '.';
}
if(b->boardSpaces[x+1][y].mineHere == 'M')
{
b->boardSpaces[x+1][y].mineHere = '.';
}
if(b->boardSpaces[x][y+1].mineHere == 'M')
{
b->boardSpaces[x][y+1].mineHere = '.';
}
if(b->boardSpaces[x-1][y].mineHere == 'M') //core dumps here
{
b->boardSpaces[x-1][y].mineHere = '.';
}
break;
}
case 1:
{
if(b->boardSpaces[x][y-1].mineHere == '.')
{
b->boardSpaces[x][y-1].mineHere = 'M';
findMines(b, x+1, y,row,column);
}
if(b->boardSpaces[x+1][y].mineHere == '.')
{
b->boardSpaces[x+1][y].mineHere = 'M';
findMines(b, x+1, y,row,column);
}
if(b->boardSpaces[x][y+1].mineHere == '.')
{
b->boardSpaces[x][y+1].mineHere = 'M';
findMines(b, x+1, y,row,column);
}
if(b->boardSpaces[x-1][y].mineHere == '.')
{
b->boardSpaces[x-1][y].mineHere = 'M';
findMines(b, x+1, y,row,column);
}
break;
}
}
x++;
continue;
}
}
}
哪个董事会等于......
0 1 .
1 . .
. . 1
我的变量是
x = 0
y = 0
row = 3
column = 3
我要做的是检查指示点右侧,左侧,上方和下方的每个空间,看看是否已经存在“M”。 (此时0,0左右上方应为NULL,右下方应为1)。
起初我以为是因为我的if语句正在检查NULL。
if(b->boardSpaces[x-1][y].mineHere == 'M') //core dumps here
但是它之前的所有工作,x,y + 1也应该是NULL,所以我迷路了。
如果重要的是我的电路板类型和我的类型等等
/*
The contents of each space in the Mines array can be either
a mine or the amount of mines adjacent to said spot.
*/
typedef union
{
int ajacentMines; //If not a mine it adds up the amount of mines around it.
char mineHere; //If mine then it holds char 'M'
}Mine;
/*
Constructs a board with a 2D array for the actual board holding the spots content
See union Mine above.
*/
typedef struct boards
{
int rows, columns; //rows and columns to make the array
Mine **boardSpaces; //a void pointer to hold said array
}Board;
答案 0 :(得分:1)
如果x
和y
为0,那么您需要在[-1][0]
位置进行检查。
这显然是出界的......这是UB,认为自己很幸运,因为它产生了异常。
只检查电路板上的位置 - 或者创建一个更大的电路板,并且不要使用边缘行和列......这样您就不需要对索引进行额外检查。< / p>