阵列错误导致控制台崩溃

时间:2014-06-09 12:31:03

标签: c++ arrays

我不知道这里有什么问题。问题是数组访问包含终止代码的最后一个元素。当我在i <= sizeof(arr)循环中使用for作为限制器时,4个元素列表可以工作,但3个元素列表会崩溃。如果我用i < sizeof(arr)替换它,3元素列表可以工作但是4元素列表中的最后一个元素被忽略。

int arrayList(string arr[])
{
    int choice;

    for (unsigned int i = 1; i <= sizeof(arr); i++)
    {
        cout << i << ". " << arr[i-1] << endl;
    }

    cout << "Select a number from 1 to " << sizeof(arr)-1 << ": ";
    cin >> choice;

    return choice;
}

这是一个调用数组列表的函数,但在访问第四个元素时崩溃。

void titleScreen()
{
    system("cls");

    int choice = 0;

    do {
        string arr[] = { "New Game", "Continue", "Exit" };

        choice = arrayList(arr);

        switch (choice)
        {
        case 1:
            newGame();
            break;
        case 2:
            continueGame();
            break;
        case 3:
            exitGame();
            break;
        default:
            choice = 0;
            cout << "Invalid choice." << endl;
        }
    } while (choice == 0);
}

这是也调用列表的段,但它可以正常工作。

do {  
        string arr[] = { "Attack", "Guard", "Skill", "Item" };

        switch (arrayList(arr))
        {
        case 1:
            hero_act = hero->attack(foe);
            break;
        case 2:
            hero_act = hero->guard();
            break;
        case 3:
            hero_act = hero->skill(foe);
            break;
        case 4:
            hero_act = hero->item();
            break;
        default:
            cout << "Action invalid." << endl;
            break;
        }
    } while (hero->hp > 0 && foe->hp > 0);

1 个答案:

答案 0 :(得分:2)

string arr[];
sizeof(arr);

不是你想要的,因为它被编译器视为

string *arr;
sizeof(arr);

这是一个编译时常量,并且总是会返回相同的值(该值取决于所使用的机器和编译器),而不管数组中实际有多少元素。

将计数作为参数传递给函数(旧C风格)是一个选项。但是,如果始终传递大小在编译时已知的自动数组,则可以执行此操作

template <size_t N>
int arrayList(string (&arr)[N])
{
}