为什么程序在结束后失败

时间:2014-02-17 03:45:38

标签: c++ arrays visual-c++

我希望有人可以回答这个问题,实际上教给我一些东西。我有这个简单的小代码片段,它可以正常工作,但在程序结束后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没有给出很多细节,所以它完全是出于好奇而生的。

3 个答案:

答案 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];

但是在循环中,您可以访问从0numplay - 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";
  ...
}

您正在修改和使用数组边界之外的元素。这会导致未定义的行为。