我有一个二维数组(棋盘,但这与问题无关),我想用一个函数填充它。我写的那个工作正常,但在启动程序后,控制台崩溃了。知道问题出在哪里?谢谢。
#include <stdio.h>
#include <stdlib.h>
void fill(int board[8][8]);
int main()
{ int board[8][8];
fill(board);
return 0;
}
void fill(int board[8][8])
{
int a,b;
for (a = 1; a <= 8; a++)
{
for (b = 1; b<= 8; b++)
{
if ((a==1) || (a==8)) board[a][b] = 7;
if ((a==2) || (a==7)) board[a][b] = 9;
if ((a==3) || (a==6)) board[a][b] = 11;
if ((a==4) || (a==5)) board[a][b] = 13;
printf("%d", board[a][b]);
}
printf("\n");
}
}
答案 0 :(得分:2)
我看到一个问题:数组从C中的0索引。所以最后一种情况是board[7][7]
。
在实际数组结束后,访问board[8][0]
实际访问子数组(行)。如果数组之后的内存不属于您的程序(着名的分段错误),它将编译但崩溃。
我猜你应该把a-1
和b-1
放在方括号之间。
答案 1 :(得分:1)
在你的循环条件中:
for (b = 1; b<= 8; b++)
和
for (a = 1; a <= 8; a++)
你的for循环运行到计数器a
并且b
等于为8.但是,你的数组本身被称为board[[8][8]
,这意味着两个数组的计数器应该是0到7.由于你的计数器超过了数组的最后一个值,它会导致 undefined 行为,并导致分段错误。
您需要将您的for循环条件更改为:
for (b = 0; b < 8; b++)
和
for (a = 0; a < 8; a++)
编辑:从for循环中的其余代码判断,更改这些循环的条件语句将改变程序的逻辑。在这种情况下,您可以在所有实例中使用board[a -1][b - 1]
而不是board[a][b]
。
使用此方法,计数器只会在两个计数器情况下达到8 - 1 = 7
,并且会像第一个解决方案一样避免分段错误。
答案 2 :(得分:1)
因为您的访问数组超出范围。数组索引在c。
中开始为零答案 3 :(得分:1)
如几条评论/答案中所述,数组索引值的范围为0到n-1,
更改以下行:
for (a = 1; a <= 8; a++)
{
for (b = 1; b<= 8; b++)
要:
for (a = 0; a <= 7; a++)
{
for (b = 0; b<= 7; b++)
相应地调整内部循环中的比较语句。