C++中数组的最大长度
最近在进行算法测试分析的时候,在main函数里面用
int num[1000000]
开了100万的int类型数组,然后发现程序运行没有结果输出直接结束,按理来说int占4个Byte,一百万个int类型需要的内存空间就是 4 x 10^6 Bytes,就是4MB的空间,那么应该在普通的电脑上这4MB应该不成问题呀,怎么会出错呢?
在查找资料后找到了原因:
大家应该都知道,数组的分配方式大概有两种方式:静态分配和动态分配。再具体点儿的话,根据数组声明的位置,我们可以将数组分为局部数组和全局数组。
那么我们暂时可以将数组分为四类:1.静态分配的局部数组 2.动态分配的局部数组 3.静态分配的全局数组 4.动态分配的全局数组。
- 静态分配的局部数组分配时,使用的是栈上的空间,因此静态分配得到的局部数组的大小受限于栈的大小。在WINDOWS下,栈的大小是2MB(或1MB),如果申请的空间超过栈的剩余空间时,将会提示溢出(这就是我所碰到的情况,一百万int已经超过了栈的大小,main函数本质也是一个局部的函数)
- 对于动态分配的局部数组和动态分配的全局数组,本质上它们都是在堆上分配空间,因此它们的大小受限于堆的大小。堆是不连续的内存区域,堆的大小受限于计算机系统中有效的虚拟内存,因此堆的大小一般都比较大
- 对于静态分配的全局数组,是在静态存储区分配内存空间,默认情况下,VS2010可容纳的全局变量数组大小是2G
解决方法
- 将数组声明为全局变量,将数组存放在静态存储区(把数组定义在main函数之外)
#include<iostream>
using namespace std;
int list[1000000];
- 使用动态内存分配,将数组存放在堆上
int *list = new int[1000000];