C++数组放在main函数内外的区别

 更新时间:2022年01月25日 14:58:21   作者:Aricl.  
大家好,本篇文章主要讲的是C++数组放在main函数内外的区别,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

先来看一道小题,第十届蓝桥杯省赛C++/B组填空题第三题

试题 C:数列求值

本题总分:10 分

【问题描述】

       给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求第 20190324 项的最后 4 位数字。

【答案提交】

       这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个 4 位整数(提示:答案的千位不为 0),在提交答案时只填写这个整数,填写多余的内容将无法得分。

思路

显然,这题目思路明确清晰,就是不断计算然后对10000进行模运算得到最后4位整数

错误代码

#include<iostream>
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++数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅析C语言中堆和栈的区别

    浅析C语言中堆和栈的区别

    堆和栈都是一种数据项按序排列的数据结构。在C语言中是非常重要的知识点,接下来通过本文给大家介绍C语言中堆和栈的区别,感兴趣的朋友一起看下吧
    2016-06-06
  • C语言中的直接插入排序(带图详细)

    C语言中的直接插入排序(带图详细)

    这篇文章主要介绍了C语言中的直接插入排序(带图详细),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • C++11时间日期库chrono的使用

    C++11时间日期库chrono的使用

    chrono是C++11中新加入的时间日期操作库,可以方便地进行时间日期操作,本文详细的介绍了一下如何使用,感兴趣的可以了解一下
    2022-01-01
  • 浅谈c++性能测试工具之计算时间复杂度

    浅谈c++性能测试工具之计算时间复杂度

    有时候除了测量算法的具体性能指数,我们也会希望测试出算法的时间复杂度,以便我们对待测试的算法的性能有一个更加直观的了解。本文将介绍c++性能测试工具之计算时间复杂度。
    2021-06-06
  • QT实战之打开最近文档功能的实现

    QT实战之打开最近文档功能的实现

    这篇文章主要为大家详细介绍了如何利用Qt实现打开最近文档功能,并实现基本的新建、打开、保存、退出、帮助等功能,感兴趣的可以动手尝试一下
    2022-06-06
  • C语言字符函数isalnum()和iscntrl()详解

    C语言字符函数isalnum()和iscntrl()详解

    大家好,本篇文章主要讲的是C语言字符函数isalnum()和iscntrl()详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • C语言指针如何实现字符串逆序反转

    C语言指针如何实现字符串逆序反转

    这篇文章主要介绍了C语言指针如何实现字符串逆序反转,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C语言实现反弹球游戏

    C语言实现反弹球游戏

    这篇文章主要为大家详细介绍了C语言实现反弹球游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • c++回调之利用sink示例

    c++回调之利用sink示例

    Sink的本质是利用C++的封装、继承、多态的面向对象来实现,从实现角度来说,更优于函数指针回调,下面是示例
    2014-04-04
  • C++ 中的 mutable关键字作用与使用场景分析(最新推荐)

    C++ 中的 mutable关键字作用与使用场景分析(最新推荐)

    C++中的mutable关键字允许在常量成员函数中修改特定成员变量,主要用于缓存机制、延迟计算和多线程同步等场景,它在设计中提供灵活性,但使用时需谨慎,本文介绍C++ 中的 mutable关键字作用与使用场景分析,感兴趣的朋友一起看看吧
    2025-02-02

最新评论