2

我有 2 个 2d 字符数组用于表示 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:不要问这个想法,我正在通过在控制台中创建战舰游戏来测试语言。我知道这是错误的......愚蠢但我仍然想尝试一下。

4

3 回答 3

3

你的数组太小了。您索引从零到四,即五个条目,但您仅将它们声明为四个。这意味着您正在覆盖内部数组,并且也超出了它们的范围。

声明数组时输入的数字不是顶部索引,而是大小。

于 2013-09-02T11:31:36.677 回答
1

您访问越界SP_AIGrid或者SP_HumanGrid4x4 矩阵。因此,您可以从 index 访问0not 34这是未定义的行为

你看,你只在索引 4(行和列)上得到未定义的行为SP_AIGrid。幸运的是,它不在SP_HumanGrid.

于 2013-09-02T11:34:29.660 回答
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 中,不要添加<=比较。

于 2013-09-02T11:37:01.157 回答