C - 2 2维Char数组得到修改

时间:2013-09-02 11:30:01

标签: c arrays char multidimensional-array

我有2个2d char数组,用于表示5x5网格。问题是当涉及函数的最后4行时(我在数组中设置一些字符的值,我用它们进行测试)。然后,如果我打印出网格,它就像这样。

SP_HumanGrid:

11---
-----
-----
-----
-----

SP_AIGrid:

11---
-----
-----
----1
11---

代码在这里:

char SP_HumanGrid[4][4]; //The Human player's grid
char SP_AIGrid[4][4]; //The AI player's grid

void SP_EmptyGrids(void)
{
int nRow,nCol;

for (nRow=0;nRow<5;nRow++)
{
    for (nCol=0;nCol<5;nCol++)
    {
        SP_HumanGrid[nRow][nCol] = POINT_WATER;
        SP_AIGrid[nRow][nCol] = POINT_WATER;
    }
}

SP_HumanGrid[0][0] = POINT_SHIP1;
SP_HumanGrid[0][1] = POINT_SHIP1;
SP_AIGrid[0][0] = POINT_SHIP1;
SP_AIGrid[0][1] = POINT_SHIP1;
}

我没有其他功能修改SP_AIGrid变量的值。它们看起来不应该相同,因为我将它们设置为相同的值吗?

PS:不要问这个想法,我正在通过在控制台中创建一个Battleships游戏来测试语言。我知道这是错误的...愚蠢但我还是想尝试一下。

3 个答案:

答案 0 :(得分:3)

你的阵列很小。您将索引从零到四,即五个条目,但您只将它们声明为四个。这意味着你要覆盖内部数组,并写出超出它们的范围。

声明数组时放入的数字不是最高索引,而是大小。

答案 1 :(得分:1)

您正在访问越界SP_AIGridSP_HumanGrid 4x4矩阵。因此,您可以从索引0访问3而不是4,这是未定义的行为

您会看到,您仅在SP_AIGrid的索引4(行和列)上获得了未定义的行为。幸运的是,它不在SP_HumanGrid

答案 2 :(得分:1)

你的for循环应该是

for (nRow=0;nRow<4;nRow++)

for (nCol=0;nCol<4;nCol++)

要记住的盲目规则,如果你声明一个大小为SIZE的数组,你的for循环应该从0开始并在SIZE之前结束1。这意味着

for(i=0;i<SIZE;i++)

并且在C中,不要在比较中添加<=

相关问题