首页 > 解决方案 > c++ 我得到这个错误 bad_array_new_length

问题描述

所以我创建了一个程序来模拟掷骰子,然后打印结果(家庭作业:))。现在我得到了一个 bad_array_new 长度并认为我知道它发生在哪里,但我真的不明白为什么。这可能是一个逻辑错误,如果有人能找到它或给我一个指针,那就太棒了。

int* CalculateThrows(int dice_one, int dice_two, int throw_count)
{
    // I think the error occurs here 
    int *digits = new int[(dice_one * dice_two) + 1]{ 0 };
    digits[0] = dice_one * dice_two+1;

    if (throw_count > 0)
    {
        for (int i = 1; i < throw_count; i++)
            digits[GetRandomValue(dice_one) + GetRandomValue(dice_two)]++;
    }
    return digits;
}

这就是我调用方法并稍后遍历数组的方式:

int main(int argc, char* argv[])
{
    int * values = CalculateThrows((int)argv[1], (int)argv[2], (int)argv[3]);
    for (int i = 1; i < values[0]; i++)
    {
        cout << i << ". Has been thrown: " << values[i];
    }
}

标签: c++

解决方案


argv[1]是指向包含第一个命令行参数的字符串的指针。所以如果你调用你的程序./program 6 5 4argv[1]将是字符串"6",而不是数字6。您应该使用atoi(argv[1])来获取号码。

在使用之前,您还应该检查是否argc至少是.4argv[3]

std::vector<int> CalculateThrows(int dice_one, int dice_two, int throw_count)
{
    std::vector<int> digits (dice_one * dice_two, 0);

    if (throw_count > 0)
    {
        for (int i = 0; i < throw_count; i++)
            digits[GetRandomValue(dice_one) + GetRandomValue(dice_two)]++;
    }
    return digits;
}

int main(int argc, char* argv[])
{
    if (argc < 4) return -1;
    std::vector<int> values = CalculateThrows(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]));
    for (size_t i = 0; i < values.size(); i++)
    {
        cout << i << ". Has been thrown: " << values[i];
    }
}

推荐阅读