我希望有人可以回答这个问题,实际上教给我一些东西。我有这个简单的小代码片段,它可以正常工作,但在程序结束后Windows抛出以下错误
program.exe已停止工作导致程序停止的问题 工作正常。 Windows将关闭该程序并通知您是否 解决方案可用。
使用关闭程序按钮
下面讨论的代码询问用户将有多少玩家,然后根据玩家的数量创建一个大小等于玩家数量的数组。然后for循环将每个字符名称打印到屏幕。这是代码
int main()
{
int numplay;
cout<<"How many players will there be? ";
cin>> numplay;
cin.ignore();
cin.get();
string *players = new string[numplay - 1];
for (int x = 1; x < numplay + 1; x++) {
string name;
cout<<"What is Player "<< x <<"'s name? ";
cin>> name;
players[x - 1] = name;
cin.ignore();
}
cin.clear();
cin.sync();
cin.get();
for (int x = 0; x < numplay; x++) {
cout<< players[x] <<"\n";
}
delete[] players;
}
事情就像我说代码编译并运行正常它只是在最后Windows抛出上面提到的错误,只有一些细节。如果从数组声明中删除-1,则问题会得到缓解。然而,这会创建一个额外未使用的数组元素。我希望这个问题是连贯的,因为Windows没有给出很多细节,所以它完全是出于好奇而生的。
答案 0 :(得分:1)
您正在访问数组越界。正如您所暗示的那样,从数组分配中删除-1
会使其正常工作。
string *players = new string[numplay - 1]; // Wrong
如果用户输入3
,那么您将只分配一个包含2个元素的数组。该数字表示元素的数量,而不是最大索引。
正确的代码是:
string *players = new string[numplay];
我还建议您对在阵列上运行的任何循环使用从零开始的索引。看到像上面一行那样的循环是令人困惑的。这样做:
for (int x = 0; x < numplay; x++) {
cout << "What is Player "<< x+1 <<"'s name? ";
cin >> players[x];
cin.ignore();
}
答案 1 :(得分:1)
您分配了numplay - 1
个数组元素,例如元素0
... numplay - 2
string *players = new string[numplay - 1];
但是在循环中,您可以访问从0
到numplay - 1
包含的元素,这是数组之外的一个元素
for (int x = 1; x < numplay + 1; x++) {
...
players[x - 1] = name;
}
在上一次迭代中,您有x = numplay
。这样,您可以访问位于数组边界之外的players[numplay - 1]
。
这也是为什么要这样做的原因
string *players = new string[numplay];
修复了您的问题。因为现在,数组元素从0
变为numplay - 1
,这符合for循环中的访问。
答案 2 :(得分:0)
string *players = new string[numplay - 1];
for (int x = 1; x < numplay + 1; x++) {
...
players[x - 1] = name;
}
...
for (int x = 0; x < numplay; x++) {
cout<< players[x] <<"\n";
...
}
您正在修改和使用数组边界之外的元素。这会导致未定义的行为。