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

String Array Causes C++ Program to Crash

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

objective是将10个名字存入一个数组,然后让用户输入一个数字随机确定'winning'名字。

唯一的问题是,一旦我执行我的代码,程序在完成 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;

两个问题。

第一,您正在实例化一个包含 10 个元素的数组,然后查找它的第 11 个元素。 首先,将 if 条件从 test < 11 更改为 test < 10。 这将解决您的崩溃问题。

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

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

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

因此,如果在输入字符串的过程中,您通过覆盖其索引保存到数组中,则可能会向数组中写入比它所能容纳的更多的字符。

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

一个简单的解决方法是在开头将名称字符串定义为一个大字符串,例如 string Name1 = "-------------------- --";

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

你的数组有 10 个元素,而你正在访问 11 个元素,从 0 到 10,这导致你的程序崩溃。因为您的代码正在访问不属于您的程序的位置。将 for 循环中的条件从 test < 11 更改为 test < 10。 如果可以,请使用string class 的“at”函数,当您尝试访问越界下标时会抛出异常。

在 for 循环中,您正试图访问 array[10],但由于数组只有 10 个元素,从 0 到 9,所以它不存在。这就是您的程序崩溃的原因。

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