字符串数组导致C ++程序崩溃

时间:2015-08-11 01:54:32

标签: c++ arrays string crash

我正在为我的编程类开发一个多功能程序,其中一个函数需要使用一个字符串数组。

目标是在数组中存储10个名称,然后让用户输入一个随机确定“获胜”名称的数字。

唯一的问题是,一旦我执行了我的代码,程序在完成10个循环后崩溃以获取名称。这是我试图识别的主要因素,导致崩溃的原因。

整个程序要大得多,但相关代码如下所示。

string Name1, Name2, Name3, Name4, Name5, Name6, Name7, Name8, Name9,     Name10, tempName, winName;

string array[10] = {Name1, Name2, Name3, Name4, Name5, Name6, Name7, Name8, Name9, Name10};

int tempNum = 0;
int winNum;
int userEntry;
int userSelection;

for (int test = 0; test < 11; test++)
{
    cout << "Enter a name: ";
    cin >> tempName;

    array[tempNum] = tempName;
    tempNum++;
}

//The program crashes at this exact spot, right after collecting the 10th name

cout << endl;
cout << "Now choose a random number between 1 and 100: ";
cin >> userEntry;

winNum = static_cast<int>(userEntry * 3.14159 + 12.7 * 10) % 10;

winName = array[winNum];

cout << endl;
cout << "The winner of the game is" << winName << "!" << endl;

3 个答案:

答案 0 :(得分:0)

您的数组有10个元素,并且您正在访问11个元素,0到10,这会导致程序崩溃。因为您的代码访问的位置不属于您的程序。将for循环中的条件从test < 11更改为test < 10。 使用&#34; at&#34; string类的函数,如果可以的话,它会在您尝试访问超出范围的下标时抛出异常。

答案 1 :(得分:0)

在for循环中,您尝试访问array[10]并且不存在,因为数组只有10个元素,从0到9.这就是程序崩溃的原因。

将for循环中的条件从for (int test = 0; test < 11; test++)更改为for (int test = 0; test < 10; test++),它应该有效。

答案 2 :(得分:-1)

两个问题。

一,你实例化一个包含10个元素的数组,然后查找它的第11个元素。 首先,从测试中改变if条件&lt; 11测试&lt; 10。 这将解决你的崩溃。

其次,您的程序可能会因大量输入而崩溃。 初始化字符串数组时,编译器会为数组分配一定量的内存。

分配给数组的内存量由编译器决定。 编译器确定每个字符串变量的大小,并将其乘以10以获得数组所需的总大小,并相应地分配那么多内存。

虽然字符串可以动态调整大小,但数组却不能。该数组具有分配给它的固定内存量。

因此,如果在输入您通过覆盖其索引而保存到数组中的字符串期间,您可以在数组中写入比它可以容纳的字符更多的字符。

将分配的内存量取决于实现,因为字符串的默认容量取决于实现。

一个简单的解决方法是在名称字符串Name1 =&#34; ---------------------- ---&#34 ;;

这样,用户输入的大小很可能小于初始值。