我写了一个小东西,询问用户一些输入(行和列),然后应该将数组中的所有内容设置为点(“。”)并将其打印出来,但这会导致我的应用程序崩溃。
void main()
{
int i,j, m, n;
printf("The number of lines (m): ");
scanf("%d", m );
printf("\nThe number of columns (n): ");
scanf("%d", n);
//create my array
char mineGrid[n][m];
//set all fields in to safe (.)
for (j = 0; j <= n; j++)
{
for (i = 0; i <= m; i++)
{
mineGrid[j][i] = ".";
}
}
//print a grid of dots
for (j = 0; j <= n; j++)
{
for (i = 0; i <= m; i++)
{
printf("%s", mineGrid[j][i]);
}
}
}
知道为什么会崩溃吗?
答案 0 :(得分:2)
这里出现重大问题的原因是你有很多看起来像
的循环for (j = 0; j <= n; j++)
/* ^ */
/* | */
/* Look! */
将从j
运行0
到n
,但您已将数组声明为
char mineGrid[n][m];
表示已为编号为0
到n-1
的行分配了空格。
所有索引循环都是错误的。编写这些循环的惯用方法是
for (j = 0; j < n; ++j)
我已经修改了范围并且还将增量从post更改为pre-这是一个旧的微优化,这些天通常不会对c产生任何影响(因为编译器足够智能来修复它),但是如果你切换到c ++并以这种方式使用一个非平凡的类,可以。所以我把它保存在我要修复的小东西列表中。
答案 1 :(得分:0)
那是因为你在数组中放入一个字符串而不是char。
这样做:
void main()
{
int i,j, m, n;
m = 5;
n = 6;
//create my array
char mineGrid[n][m];
//set all fields in to safe (.)
for (j = 0; j <= n; j++)
{
for (i = 0; i <= m; i++)
{
mineGrid[j][i] = '.';
}
}
//print a grid of dots
for (j = 0; j <= n; j++)
{
for (i = 0; i <= m; i++)
{
printf("%c", mineGrid[j][i]);
}
printf("\n");
}
}
答案 2 :(得分:0)
您创建了n X m个元素,但在数组中使用了n + 1 X m + 1个元素。像bellow一样使用
一
for (j = 0; j < n; j++)
{
for (i = 0; i < m; i++)
{
mineGrid[j][i] = '.';
}
}
答案 3 :(得分:0)
这是因为对于大小 N 的数组,有效数组索引 0到N-1 。但是您正在访问 N 元素,该元素不是有效的数组索引,访问它会调用未定义的行为。
for (j = 0; j <= n; j++)
{
for (i = 0; i <= m; i++) // Array out of bounds in either condition check
话虽如此,您的输入也存在问题。
scanf("%d", m ); // Missing & operator before m.