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

(0)

相关推荐

  • C++二维数组螺旋加密信息

    由题目要求可知 题目要求先创建一个r行c列的矩阵 然后输入一串字符串 字符串长度肯定小于r*c/5 由A C M的表示方式可以看出每个字符由5位的二进制位系统表示(无符号位) 那么我们首先可以先创建一个字符串类型 string a; cin>>a; rt 字母表示它是26字母表中第几个字母 很多人第一时间想用数组11对应 或者switch语句选择 但转念一想就知道太麻烦了 所以这里用字符的ASCII码减去64来表示它的数字形式 转ASCII码都知道 强类型转换 由于不止一个字符 为了提高代码的

  • C++数组和指针的区别与联系

    目录 1 数组和指针的概念 2 数组和指针的操作 2.1 赋值 2.2 存储 2.3 大小 2.4 初始化 3 数组和指针的传参 3.1 数组的传参 3.2 指针的传参 4 总结 前言: 一直以来,有很多地方在说到数组和指针时都会说数据就是指针,这种观点也被越来越多的人接受.本文将主要介绍数组和指针.是不是一样的大家自己理解.如此而已…… 1 数组和指针的概念 数组:具有固定大小和连续内存空间的相同数据集合.里面的存储的元素具有地址连续性和数据类型相同的特点.指针:是指存放内存地址的变量.从0开

  • C++如何用数组模拟链表

    目录 前言 1.单链表 2.双链表 总结 前言 链表是指由一系列储存在非连续储存空间 结点组成的储存结构.每个结点由两部分组成:一是储存元素的数据域,一是储存下一个节点地址的指针域.用数组模拟链表可以十分清晰明了地理解这一定义. 在这里,我们简单地介绍一下单链表和双链表两种链表以及用数组模拟实现它们的方式. 1.单链表 单链表是指针方向单向的链表,即a结点的指针域储存着b结点的地址,而b结点的指针域内没有储存a结点的地址.在访问时,可以由a到b访问,而不能由b到a访问. 如图可以清晰地看到,各个

  • C++中的数组你真的理解了吗

    目录 1 概述 2 一维数组 2.1 一维数组定义方式 2.2 一维数组组名 2.3 冒泡排序 3 二维数组 3.1 二维数组定义方式 3.2 二维数组数组名 3.3二维数组应用举例 总结 1 概述 所谓数组,就是一个集合,里面存放了相同类型的数据元素. 特点1:数组中的每个数据元素都是相同的数据类型. 特点2:数组是由连续的内存位置组成的. 2 一维数组 2.1 一维数组定义方式 一共有三种 1.数据类型 数组名[数组长度]; 2.数据类型 数组名[数组长度]={值1,值2,值3,...};

  • C++数组的定义详情

    目录 1.数组概念 2.数组的复杂声明 3.数组到指针 4.数组操作 4.1获取数组元素个数 4.2使用for循环遍历数组(C++11开始支持) 5.拓展 5.1C字符串 5.2vector 5.3string 6.思考 6.1思考以下代码输出什么? 6.2以下代码能够编译通过吗? 6.3在另一个文件中定义了数组,如何在该文件中定义? 上一篇讲解了类型,通过类型来开始本篇的学习: int a[10]; 上述代码中的a是什么类型呢? 相信很多人都知道是一个数组类型,具体来说是一个int[10]的类

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

    目录 思路 错误代码 正确代码 问题分析 总结 先来看一道小题,第十届蓝桥杯省赛C++/B组填空题第三题 试题 C:数列求值 本题总分:10 分 [问题描述] 给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和.求第 20190324 项的最后 4 位数字. [答案提交] 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一 个 4 位整数(提示:答案的千位不为 0),在提交答案时只填写这个整数,填写多余的内容将无法得分. 思路 显然,

  • 解决java main函数中的args数组传值问题

    这几天面试中有遇到关于main数组中的args数组传值的问题,一般是从命令提示符中传值,也可以直接在java代码中赋值. 而且这个数组的长度是动态的,根据传值的个数确定数组的长度. 1.从命令提示符中传值 我在桌面新建了一个文本文档重命名为TestMain.java,代码如下 public class TestMain { public static void main(String[] args) { System.out.println("hello "+args[0]); Sys

  • 如何写好C main函数的几个注意事项

    学习如何构造一个 C 文件并编写一个 C main 函数来成功地处理命令行参数. 我知道,现在孩子们用 Python 和 JavaScript 编写他们的疯狂"应用程序".但是不要这么快就否定 C 语言 -- 它能够提供很多东西,并且简洁.如果你需要速度,用 C 语言编写可能就是你的答案.如果你正在寻找稳定的职业或者想学习如何捕获空指针解引用,C 语言也可能是你的答案!在本文中,我将解释如何构造一个 C 文件并编写一个 C main 函数来成功地处理命令行参数. 我:一个顽固的 Uni

  • c语言main函数使用及其参数介绍

    每一C程序都必须有一main()函数,可以根据自己的爱好把它放在程序的某个地方.有些程序员把它放在最前面,而另一些程序员把它放在最后面,无论放在哪个地方,以下几点说明都是适合的. 在Turbo C2.0启动过程中,传递main()函数三个参数:argc,argv和env.* argc:整数,为传给main()的命令行参数个数.* argv:字符串数组.char* argv[],我们可以看出,argv的类型是char* [],即是一个指向字符数组的指针,所以我们还可以写作:char** argv.

  • 详解C++中的指针、数组指针与函数指针

    C++中一个重要的特性就是指针,指针不仅具有获得地址的能力,还具有操作地址的能力.指针可以用于数组.或作为函数的参数,用来访问内存和对内存的操作,指针的使用使得C++很高效,但是指针也非常危险,使用不当会带来比较严重的问题. 1.指针 程序中所有的变量和常量都存在一个内存地址中,当然,函数也有对应的内存地址,内存地址的不同会导致程序执行时有所不同. 指针就是用来控制和存储内存地址的变量,它指向单个对象的地址,除了void之外,指针的数据类型与所指向地址的变量数据类型保持一致. 2.如何定义指针.

  • c语言中main函数用法及知识点总结

    1.main函数是C程序的入口函数,即程序的执行从main函数开始,其他函数的调动也直接或间接地在main函数中调用. 2.main函数的返回值用于解释程序的退出状态. 若返回0,则表示程序正常退出.返回其他数字的含义由系统决定.通常返回非零代表程序异常退出. 实例 #include <stdio.h> #include <string.h> int main(int argc, char **argv) { int i = 0; printf("The program

  • C语言 main 函数详情

    目录 1.main() 2.void main() 3.int main(void) 4.int main () 5.int main(int argc,char *argv[]) 前言: 但凡是学过C语言的人,都知道要先写main函数,然而很多时候我们看到的main函数却各有差异,这究竟是为啥?哪种是对的呢?今天我们就来聊聊main函数.那么main函数一共有多少个版本呢? 1.main() 直接的mian()并没有返回值,没有入参.这种写法实际来说,部分编译器会显示警告,并且会返回默认值为i

  • 学习Python,你还不知道main函数吗

    目录 什么是 Python 函数 Python 中的 main 函数是什么 一个基本的 Python main() Python 执行模式 Python 中的 __main__ 是什么 尽可能使用函数和类 使用 __name__ 来控制代码的执行 创建一个包含要运行代码的函数 main() 从 main() 调用其他函数 Python 中的 main 函数充当程序的执行点,在 Python 编程中定义 main 函数是启动程序执行的必要条件,不过它仅在程序直接运行时才执行,而在作为模块导入时不会

  • JavaScript学习笔记(三):JavaScript也有入口Main函数

    在C和Java中,都有一个程序的入口函数或方法,即main函数或main方法.而在JavaScript中,程序是从JS源文件的头部开始运行的.但是某种意义上,我们仍然可以虚构出一个main函数来作为程序的起点,这样一来不仅可以跟其他语言统一了,而且说不定你会对JS有更深的理解. 1. 实际的入口 当把一个JavaScript文件交给JS引擎执行时,JS引擎就是从上到下逐条执行每条语句的,直到执行完所有代码. 2. 作用域链.全局作用域和全局对象 我们知道,JS中的每个函数在执行时都会产生一个新的

  • PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)

    一.数组遍历的3个方法介绍 1. foreach() foreach()是一个用来遍历数组中数据的最简单有效的方法. #example1: 复制代码 代码如下: <?php $colors= array('red','blue','green','yellow'); foreach ($colorsas$color){ echo "Do you like $color? <br />"; } ?> 显示结果: Do you like red? Do you li

随机推荐