我有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游戏来测试语言。我知道这是错误的...愚蠢但我还是想尝试一下。答案 0 :(得分:3)
你的阵列很小。您将索引从零到四,即五个条目,但您只将它们声明为四个。这意味着你要覆盖内部数组,并写出超出它们的范围。
声明数组时放入的数字不是最高索引,而是大小。
答案 1 :(得分:1)
您正在访问越界。 SP_AIGrid
或SP_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中,不要在比较中添加<=
。