服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++数组放在main函数内外的区别

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

2022-09-06 12:03Aricl. C/C++

大家好,本篇文章主要讲的是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;

乍看完全没啥问题吧,但运行结果却是下面这样

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

 很懵,疯狂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;
}

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

 

问题分析 

那为什么大数组一定要放在main函数外面而不能放在里面呢?

原因在于开设数组的区域不同,在运行代码的时候,操作系统会分配不同的内存区域来运行代码

栈区:由操作系统自动分配释放,存放函数的参数值,局部变量的值,不需要时系统会自动清除,内存较小
堆区:由new分配的内存块,也就是说在代码中new一个数组,内存由堆区分配;堆区不由编译器管,由应用程序控制,相当于程序员控制。如果程序员没有释放掉,程序结束后,操作系统会自动回收
数据区:也称全局区或者静态区,存放全局的东西,比如全局变量,内存较大
代码区:存放执行代码的地方

简而言之,在main函数外面开设一个数组,它的内存分配在数据区里;而如果在main函数内部开设一个数组,它的内存分配在栈区内。一般来说栈区的内存是比较小的,所以平常开一些小一点的数组是完全没问题的;但如果题目要求的数组比较大,那就会出现爆满溢出的情况,程序将无法访问内存而出错;相反,数据区的内存较大,就不会出现这样的问题。这就是为什么开设大数组一定要放在main函数之外的原因。
 

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

 

总结

到此这篇关于C++数组放在main函数内外的区别的文章就介绍到这了,更多相关C++数组内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_52487066/article/details/122676718

延伸 · 阅读

精彩推荐
  • C/C++深入讲解Socket原理

    深入讲解Socket原理

    这篇文章深入的讲解Socket原理,并附带实例代码。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    飞_哥10692022-03-08
  • C/C++c语言中十六进制转二进制显示的实现方法

    c语言中十六进制转二进制显示的实现方法

    本篇文章对c语言中十六进制转二进制显示的实现方法进行了详细的分析介绍,需要的朋友参考下...

    C语言中文网5062020-11-28
  • C/C++详解C++中指针和引用的区别

    详解C++中指针和引用的区别

    这篇文章主要介绍了C++中指针和引用的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着...

    青青胡杨4402021-07-28
  • C/C++c语言没有try catch的替代方案

    c语言没有try catch的替代方案

    这篇文章主要介绍了c语言没有try catch的替代方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    AD_milk12262021-09-10
  • C/C++C++ 输入scanf()和输出printf()的操作

    C++ 输入scanf()和输出printf()的操作

    这篇文章主要介绍了C++ 输入scanf()和输出printf()的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    lx520aa7832021-10-08
  • C/C++深入理解C++中变量的存储类别和属性

    深入理解C++中变量的存储类别和属性

    这篇文章主要介绍了C++中变量的存储类别和属性,是C++入门学习中的基础知识,需要的朋友可以参考下...

    C++教程网11562021-03-12
  • C/C++QT编写地图实现在线轮廓图的示例代码

    QT编写地图实现在线轮廓图的示例代码

    轮廓图也叫行政区划,这里的轮廓图是指百度地图的区域轮廓图。本文将为大家介绍QT如何实现在线轮廓图的编写,感兴趣的小伙伴可以跟随小编一起学习...

    feiyangqingyun5432022-07-31
  • C/C++深入理解大数与高精度数的处理问题

    深入理解大数与高精度数的处理问题

    本篇文章是对大数与高精度数的处理进行了详细的分析介绍,需要的朋友参考下...

    C语言教程网4682020-12-07