我使用了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:不要问这方面的想法,我是通过在控制台中创建一个战列舰游戏来测试语言的。我知道这是错误的..。很蠢但我还是想试试。
发布于 2013-09-02 11:34:29
您正在访问超出界限的。SP_AIGrid或SP_HumanGrid是4x4矩阵。因此,您可以从索引0访问3而不是4,这是一个未定义行为。
您知道,您只在SP_AIGrid中的索引4(行和列)上获得未定义的行为。幸运的是,它不在SP_HumanGrid中。
发布于 2013-09-02 11:31:36
你的数组很小。索引从0到4,即5个条目,但您只将它们声明为4个。这意味着您正在覆盖内部数组,并将其写入超出它们的范围。
在声明数组时输入的数字不是顶部的索引,而是大小。
发布于 2013-09-02 11:37:01
您的for循环应该是
for (nRow=0;nRow<4;nRow++)
和for (nCol=0;nCol<4;nCol++)
要记住的一个盲规则是,如果您声明了一个大小数组,那么for循环应该从0开始,在大小之前结束1。这意味着
for(i=0;i<SIZE;i++)
在C中,不要在比较中添加<=。
https://stackoverflow.com/questions/18572201
复制相似问题