访问冲突写入位置动态分配的数组

坎贝尔罗兰

我正在写一段代码。作为这段代码的一部分,我决定使用动态分配的数组来存储一组字符串。但是,当我尝试为我的数组分配一个值时,我得到了异常

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;
}
DJ1986
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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章