赞
踩
平常使用c++的时候,都是使用int a[2] = {0};这样的格式对其的含义并不清楚。。
然后定义一个很大的数组时候,我们会发现可能出现放在主函数里面定义不允许,放在外部却可以的情况。
已经到大三还对对数组的初始化一知半解,实在是惭愧 。秉承着知错能改就可以当做错误没有发生的精神,写一篇博文记录一下。
全局数组:定义在函数体外的数组
局部数组:定义在函数体内的数组
据网上的说法,全局数组无论有无初始化,都会被赋值为0。而局部数组的初始值由编译器来决定。
这里以DEV-C++5.11版本的编译器为例子
#include<iostream> int c[5]; int d[5]={}; using namespace std; int main() { int a[5]; int b[5]={}; cout<<"a:"<<endl; for(int i = 0; i < 5; i++) cout << a[i] << endl; cout<<"b:"<<endl; for(int i = 0; i < 5; i++) cout<< b[i] << endl; cout<<"c:"<<endl; for(int i = 0; i < 5; i++) cout<< c[i] << endl; cout<<"d:"<<endl; for(int i = 0; i < 5; i++) cout<< d[i] << endl; return 0; }
结果如图

可以看到只有a中的数据因为声明的时候没有定义被填入了奇怪的数值;而全局数组没有定义也默认填充0。
试着改变int b[5]={1}; int b[5]={2};int b[5]={2,3,4};int b[5]={2,3,4,5,6,7};




可以得出规律:
声明的长度与赋值长度不相等:声明的长度>赋值长度,后面用0补足,
声明的长度>赋值长度,发生编译错误;
总而言之
定义全局数组,默认值为0
定义局部数组,不声明则都为机器垃圾数;声明之后如果长度不够填充0,。
定义局部数组需要使值为同一个数时最好用memset(数组,初始值,自定义长度);
C++编译文件的内存分配为栈区、堆区、静态区(全局区)、常量区、代码区
全局变量存储在内存中的静态区(static),局部变量存储在栈区(stack)
在windows下,栈区的大小为2M,也就是210241024=2097152字节,栈区的可用空间具体未知,试着定义一个大小100w的数组就炸了。
而静态区的可用空间大概是2^32字节,远远大于栈区。
所以需要定义一个很大的数组时,只能作为全局数组。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。