(一)遇到的问题
在“桶排序”中遇到了这样的一个程序:
具体代码如下:
#include<iostream>
using namespace std;
int main(){
int n,number,num[1001];
cin>>n;
for(int i=1;i<=n;++i){
cin>>number;
num[number]++;
}
for(int k=0;k<1001;++k){
for(int j=1;j<num[k];++j) cout<<k<<endl;
}
return 0;
}
小编吭哧吭哧搞了半天一运行错了。
如下图所示:
这什么玩意,怎么搞的这样,,这不是我想要的啊,,啥情况,,内心一万句,卧槽,,,,,,
(二)解决办法
这个问题,其实是有关数组的定义,在网上找到了大佬给的解决办法
只需要
没错,你没看到,这个图有点抽象,但是就是把 数组定义的内容放到 主函数之前,至于为什么?
因为
定义在主函数外面,在系统运行时会将数组初始化为0,但定义在主函数内就不一定了,
这只是其一 ,
其二还有,
请看下面:
ps:是抄的!!!
原因在于开设数组的区域不同,在运行代码的时候,操作系统会分配不同的内存区域来运行代码
栈区:由操作系统自动分配释放,存放函数的参数值,局部变量的值,不需要时系统会自动清除,内存较小
堆区:由new分配的内存块,也就是说在代码中new一个数组,内存由堆区分配;堆区不由编译器管,由应用程序控制,相当于程序员控制。如果程序员没有释放掉,程序结束后,操作系统会自动回收
数据区:也称全局区或者静态区,存放全局的东西,比如全局变量,内存较大
代码区:存放执行代码的地方
简而言之,在main函数外面开设一个数组,它的内存分配在数据区里;而如果在main函数内部开设一个数组,它的内存分配在栈区内。一般来说栈区的内存是比较小的,所以平常开一些小一点的数组是完全没问题的;但如果题目要求的数组比较大,那就会出现爆满溢出的情况,程序将无法访问内存而出错;相反,数据区的内存较大,就不会出现这样的问题。这就是为什么开设大数组一定要放在main函数之外的原因。