#include<cstdio>
int main()
{
int ans[1000010];
ans[1]=ans[2]=1;
int n;
scanf("%d",&n);
for(int i=3;i<=n;i++)
ans[i]=(ans[i-1]+ans[i-2])%10007;
printf("%d\n",ans[n]);
return 0;
}
c++问题求指点。下面程序编译通过,但运行不出来,不知道为什么。
答案:6 悬赏:0
解决时间 2021-01-29 17:35
- 提问者网友:生亦何欢
- 2021-01-29 13:02
最佳答案
- 二级知识专家网友:浪者不回头
- 2021-01-29 14:11
栈溢出!
你在 main 函数中,定义了局部变量 int ans[1000010]。这个数组可是有4MB之大
我印象中,Windows应用程序,每线程栈大小默认在1MB。超出这个大小,就因栈溢出而崩溃了。
修改的方法是,使用堆内存。修改代码如下:
#include <cstdio>
int main() {
int *ans = new int[1000010]; // 在堆中分配内存
ans[1]=ans[2]=1;
int n;
scanf("%d",&n);
for(int i=3;i<=n;i++)
ans[i]=(ans[i-1]+ans[i-2])%10007;
printf("%d\n",ans[n]);
delete []ans; // 释放内存
return 0;
}
你在 main 函数中,定义了局部变量 int ans[1000010]。这个数组可是有4MB之大
我印象中,Windows应用程序,每线程栈大小默认在1MB。超出这个大小,就因栈溢出而崩溃了。
修改的方法是,使用堆内存。修改代码如下:
#include <cstdio>
int main() {
int *ans = new int[1000010]; // 在堆中分配内存
ans[1]=ans[2]=1;
int n;
scanf("%d",&n);
for(int i=3;i<=n;i++)
ans[i]=(ans[i-1]+ans[i-2])%10007;
printf("%d\n",ans[n]);
delete []ans; // 释放内存
return 0;
}
全部回答
- 1楼网友:萝莉姐姐鹿小北
- 2021-01-29 19:08
你定义的数组数量太多了 导致内存溢出,你把数组的数量级改的小一点比如100就可以了
- 2楼网友:留下所有热言
- 2021-01-29 17:30
main函数调用时ans[1000010]是保存在栈空间里的,一般栈空间是2M,而1000000*4有近乎4M,那么大的数组自然会造成栈溢出,建议用new来创建大数组,保存在堆里。
- 3楼网友:不羁的心
- 2021-01-29 16:49
给return前加一句
system("PAUSE");
- 4楼网友:糜废丧逼
- 2021-01-29 15:30
1. 我滴个神,第一次看见变量用中文的,虽然现在编译器可以这么搞,但是劝你写任何一行代码都不要用中文作为变量名,或者方法名。
2. 代码改了一下:ps:第一次见这么写代码的,特地用vs2012编译运行了一下,没啥大问题。老的编译器可能就不一定支持变量命名为中文了。
3. int main()
{
double 摄氏度;
cout << "请输入摄氏度: ";
cin >> 摄氏度;
cin.get();
double 华氏 = 0.0;
华氏 = 华氏度(摄氏度); // 这里传错了吧,按照你的意思。
cout << 摄氏度 << "摄氏度 = " << 华氏 << "华氏度";
cin.get();
}
double 华氏度(double 摄氏)
{
//double 华氏 = 摄氏 * 18 + 32;
double 华氏 = 9 * 摄氏 / 5 + 32;
return 华氏;
}
- 5楼网友:萝莉姐姐鹿小北
- 2021-01-29 14:26
没有编译你的程序。马上要睡觉了。
初步怀疑是你的ans[1000010]过大。由于该数组是存放在栈区的(局部变量是存储在栈区的)。栈区一般只能存储1M到2M的数据。1000010 * 4 / 1000 / 1000 = 4M,远远大于2M。造成栈区不足。
此时程序是无法运行的。
如果想了解更多栈区,堆区,静态区的内容,可以上百度进行查询。希望能采纳我的答案。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯