先来看一道小题,第十届蓝桥杯省赛c++/b组填空题第三题
试题 c:数列求值
本题总分:10 分
【问题描述】
给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求第 20190324 项的最后 4 位数字。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个 4 位整数(提示:答案的千位不为 0),在提交答案时只填写这个整数,填写多余的内探戈基本步容将无法得分。
显然,这题目思路明确清晰,就是不断计算然后对10000进行模运算得到最后4位整数
#include<iostr描写春天的谚语eam>using namespace std;const int mod=10000;int main(){int a[20190324]={0,1,1,1};//a[0]为0,使得下标与序号一致 for(int i=4;i<20190325;i++){a[i]=(a[i-3]+a[i-2]+a[i-1])%mod;}cout<<a[20190324];return 0;字义
乍看完全没啥问题吧,但运行难溶性碱结果却是下面这样
很懵,疯狂debug后,发现原因竟然是:
大数组不能放在main函数里面,要定义在main函数外面成为全局变量!
#include<iostream>using namespace std;const int mod=10000;int a[20190324]={0,1,1,1};//a[0]为0,使得下标与序号一致int main(){ for(int i=4;i<20190325;i++){a[i]=(a[i-3]+a[i-2]+a[i-1])%mod;}cout<<a[20190324];return 0;}
那为什么大数组一定要放在main函中考口号数外面而不能放在里面呢?
原因在于开设数组的区域不同,在运行代码的时候,操作系统会分配不同的内存区域来运行代码
栈区:由操作系统自动分配释放,存放函数的参数值,局部变量的值,不需要时系统会自动清除,内存较小
堆区:由new分配的内存块,也就是说在代码中new一个数组,内存由堆区分配;堆区不由编译器管,由应用程序控制,相当于程序员控制。如果程序员没有释放掉,程序结束后,操作系统会自动回收
数据区:也称全局区或者静态区,存放全局的东西,比如全局变量,内存较大
代码区:存放执行代码的地方
简而言之,在main函数外面开设一个数组,它的内存分配在数据区里;而如果在main函数内部开设一个数组,它的内存分配在栈区内。一般来说栈区的内存是比较小的,所以平常开一些小一点的数组是完全没问题的;但如果题目要求的数组比较大,那就会出现爆满溢出的情况,程序将无法访问内存而出错;相反,数据区的内存较大,就不会出现这样的问题。这就是为什么开设大数组一定要放在main函数之外的原因。
到此这篇关于c++数组放在main函数内外的区别的文章就介绍到这了,更多相关c++数组内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 18:33:54,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/33bf4a4219e7bd3a1c4c5ffb2d7bd846.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:C++数组放在main函数内外的区别.doc
本文 PDF 下载地址:C++数组放在main函数内外的区别.pdf
留言与评论(共有 0 条评论) |