Я пытаюсь попрактиковаться в новых и удалить функции, но мой код «запускает точку останова» - PullRequest
0 голосов
/ 03 мая 2020

Когда я пытаюсь запустить свой код, который должен возвращать факториал числа, он вызывает точку останова в соответствии с Visual Studio. Я знаю, что есть лучшие способы сделать это, но я хочу попрактиковаться в использовании указателей, а также функций new и delete.

#include<iostream>

using namespace std;

int main()
{
    int* p1;
    int num, factorial = 1;
    cout << "Write the number: ";
    cin >> num;
    p1 = new int[num];
    for (int i = 0; i < num; i++)
    {
        p1 = p1 + i;
        *p1 = i + 1;
        factorial *= (*p1);
    }
    cout << "The factorial is: " << factorial << endl;
    cout << "Do you want to do it again? ";
    char yn;
    cin >> yn;
    while (yn == 'y')
    {
        factorial=1;
        delete[] p1;
        cout << "Write the number: ";
        cin >> num;
        p1 = new int[num];
        for (int i = 0; i < num; i++)
        {
            p1 = p1 + i;
            *p1 = i + 1;
            factorial *= (*p1);
        }
        cout << "The factorial is: " << factorial<<endl;
        cout << "Do you want to do it again? ";
        cin >> yn;
    }
    return 0;
}

Я был бы признателен за объяснение больше, чем другой способ сделать это.

1 Ответ

1 голос
/ 03 мая 2020

Взгляните на эту часть l oop:

for (int i = 0; i < num; i++)
{
    p1 = p1 + i; // <--- Here

Здесь, я полагаю, что вы намеревались сказать «сделать p1 точку i шагов после начала массив, на который он указывает. " Однако то, что вы написали здесь, не делает этого. В частности:

  • На первой итерации это 0 шагов после начала.
  • На второй итерации 0 + 1 = 1 шаг после начала.
  • На третьей итерации 0 + 1 + 2 = 3 шага после начала.
  • На четвертой итерации 0 + 1 + 2 + 3 = 6 шагов после начала.

В конце концов, это приведет к выходу за пределы конца вашего массива, что может быть непосредственной причиной вашего cra * sh.

Чтобы исправить это, вместо перемещения указателя вперед, рассмотрите используя индексирование массива:

for (int i = 0; i < num; i++)
{
    p1[i] = i + 1;
    factorial *= p1[i];
}

Или, если вы хотите использовать указатели, создайте отдельный указатель:

for (int i = 0; i < num; i++)
{
    int* p2 = p1 + i;
    *p2 = i + 1;
    factorial *= (*p2);
}

Надеюсь, это поможет!

...