我正在写一段代码。作为这段代码的一部分,我决定使用动态分配的数组来存储一组字符串。但是,当我尝试为我的数组分配一个值时,我得到了异常
Exception thrown at 0x50D540C9 (vcruntime140d.dll) in Glicko2.exe: 0xC0000005: Access violation writing location 0xC39903E3.
通过研究这个主题,似乎这个异常主要出现在您尝试写入数组外部时。但是在我编写它的 for 循环内部,应该不可能在它之外写。异常发生在该行
posResponsesTeamNames[i] = teamName;
我的代码是
int league::matchSet()
{
std::string currLine;
std::string *posResponsesTeamNames = new std::string[league::numTeams];
std::string posResponsesWon[3] = { "1","2","3" };
team* team1;
team* team2;
bool successful = false;
for (int i = 0; i < league::numTeams; i++) {
std::string teamName = league::getName(i + 1);
for (i = 0; i < teamName.size(); i++) {
teamName.at(i) = toupper(teamName.at(i));
}
posResponsesTeamNames[i] = teamName;
}
std::cout << posResponsesTeamNames[1];
roundStart:
for (int i = 0; i < league::numMatches; i++) {
std::cout << "for match " << i + 1 << " please enter name of first team to play: ";
std::getline(std::cin, currLine);
int parsed = parseText(currLine, posResponsesTeamNames);
if (parsed == 2) {
delete[] posResponsesTeamNames;
prepForEnd();
return 2;
}
else if (parsed == 0) {
goto roundStart;
}
for (int i = 0; i < league::teams.size(); i++) {
if (currLine == league::teams.at(i).getName()) {
successful = true;
team1 = &league::teams.at(i);
}
}
if (successful == false) {
std::cout << "ERROR: Invalid team name entered";
goto roundStart;
}
secondTeam:
std::cout << "for match " << i + 1 << " please enter name of second team to play: ";
std::getline(std::cin, currLine);
parsed = parseText(currLine, posResponsesTeamNames);
if (parsed == 2) {
delete[] posResponsesTeamNames;
prepForEnd();
return 2;
}
else if (parsed == 0) {
goto secondTeam;
}
for (int i = 0; i < league::teams.size(); i++) {
if (currLine == league::teams.at(i).getName()) {
successful = true;
team2 = &league::teams.at(i);
}
}
if (successful == false) {
std::cout << "ERROR: Invalid team name entered";
goto secondTeam;
}
whoWon:
std::cout << "please enter 1 if the first team won, 2 if the second team won or 3 if it was a draw: ";
std::getline(std::cin, currLine);
parsed = parseText(currLine, posResponsesWon);
if (parsed == 2) {
delete[] posResponsesTeamNames;
prepForEnd();
return 2;
}
if (parsed == 0) goto whoWon;
}
delete[] posResponsesTeamNames;
}
1 std::string currLine;
2 std::string *posResponsesTeamNames = new std::string[league::numTeams];
3 std::string posResponsesWon[3] = { "1","2","3" };
4 team* team1;
5 team* team2;
6 bool successful = false;
7 for (int i = 0; i < league::numTeams; i++) {
8 std::string teamName = league::getName(i + 1);
9 for (i = 0; i < teamName.size(); i++) {
10 teamName.at(i) = toupper(teamName.at(i));
11 }
12 posResponsesTeamNames[i] = teamName;
13 }
假设:League::numTeams 的值为 10
在第 2 行,您正在创建一个大小为 10(league::numTeams) 的数组。
在第 7 行,创建了一个局部变量 counter i。
在第 8 行,创建一个局部变量teamName
在第 9 行,将 0 分配给i(在第 7 行创建)并开始一个循环。你在这个循环中增加它。teamName 的大小可能超过 10(League::numTeams)。让我们假设 12。
所以i的值可能大于 10(league::numTeams)。现在在第 12 行,您在posResponsesTeamNames中的位置i中分配值,现在为12。这个任务肯定会失败。
可能的解决方案:在第 9 行,而不是使用i,使用int j作为局部变量teamName上的第二个计数器
我希望这能给你答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句