当我尝试运行代码时,该代码应返回数字的阶乘,根据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;
}
我将很欣赏一个解释,而不是另一种方式。
看看循环的这一部分:
for (int i = 0; i < num; i++)
{
p1 = p1 + i; // <--- Here
[这里,我相信您的意图是说“使p1
指向i
越过它指向的数组的开头。”但是,您在此处编写的内容无法做到这一点。具体来说:
最终,这将使数组末尾过大,这可能是崩溃的直接原因。
要解决此问题,请不要使用指针前移,而应考虑使用数组索引:
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);
}
希望这会有所帮助!