传递2D数组以在C中运行

时间:2017-03-25 15:08:54

标签: c multidimensional-array

我有一个二维数组(棋盘,但这与问题无关),我想用一个函数填充它。我写的那个工作正常,但在启动程序后,控制台崩溃了。知道问题出在哪里?谢谢。

#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");
    }
}

4 个答案:

答案 0 :(得分:2)

我看到一个问题:数组从C中的0索引。所以最后一种情况是board[7][7]

在实际数组结束后,访问board[8][0]实际访问子数组(行)。如果数组之后的内存不属于您的程序(着名的分段错误),它将编译但崩溃。

我猜你应该把a-1b-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++)

相应地调整内部循环中的比较语句。