[我正在尝试练习新功能和删除功能,但是我的代码'触发断点'

问题描述 投票:0回答:1

当我尝试运行代码时,该代码应返回数字的阶乘,根据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;
}

我将很欣赏一个解释,而不是另一种方式。

c++ arrays pointers breakpoints new-operator
1个回答
0
投票

看看循环的这一部分:

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步。

最终,这将使数组末尾过大,这可能是崩溃的直接原因。

要解决此问题,请不要使用指针前移,而应考虑使用数组索引:

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);
}

希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.