中易网

c++问题求指点。下面程序编译通过,但运行不出来,不知道为什么。

答案:6  悬赏:0  
解决时间 2021-01-29 17:35
#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;
}
最佳答案
栈溢出!


你在 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;
}
全部回答
你定义的数组数量太多了 导致内存溢出,你把数组的数量级改的小一点比如100就可以了
main函数调用时ans[1000010]是保存在栈空间里的,一般栈空间是2M,而1000000*4有近乎4M,那么大的数组自然会造成栈溢出,建议用new来创建大数组,保存在堆里。
给return前加一句 system("PAUSE");
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 华氏; }
没有编译你的程序。马上要睡觉了。 初步怀疑是你的ans[1000010]过大。由于该数组是存放在栈区的(局部变量是存储在栈区的)。栈区一般只能存储1M到2M的数据。1000010 * 4 / 1000 / 1000 = 4M,远远大于2M。造成栈区不足。 此时程序是无法运行的。 如果想了解更多栈区,堆区,静态区的内容,可以上百度进行查询。希望能采纳我的答案。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
迷你仓,武汉那家价格和环境好点,魔方自助仓
10000v,400kW电机,带355kW 水泵,脱开水泵
青岛市是沿海城市吗?
对于烫卷的头发什么牌子发膜好
我要找到关于眼花的成语
发现自己对一个男同事的有感情了,如果你是个
想问问跳舞机有专门学习的地方吗?
步步高家教机英语、语文查不多怎么办
试比较取保候审、监视居住与拘留、逮捕的异同
用胡萝卜榨汁喝好吗?有什么好处?
钟表上有三个大格,那怎么平均分成
关于弹簧测力计的使用方法的说法中,错误的是
面试快要结束时,面试人员问你,你还有什么问
中国建设银行24小时自助银行(万达广场支行)(
iOS的label如何既有边框又有背景色
推荐资讯
电脑显示器怎么挂到墙上?
谁能借我1500,急用,一个月半还清,利息100
新发村地址在什么地方,想过去办事
请问在利融网借款的话,是怎么借的啊? 求各位
女生迎面和男生走,先看的男生,然后男生看到
大专专业:计算机应用技术。 有没有学过的,
载流圆线圈平面内磁场分布 为什么r越大磁场越
我在泉州市南环路万祥商城附近怎么去泉州高铁
怎么获得免费的qq绿砖。
中国从古至今还用过哪些除了克.千克和吨的重
次北固山下逐字逐句翻译
-1∧4-1/6×〔2(-3)∧2〕= 过程
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?