当前位置:   article > 正文

c/c++的数组_局部变量定义数组

局部变量定义数组

平常使用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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

结果如图
在这里插入图片描述
可以看到只有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字节,远远大于栈区。
所以需要定义一个很大的数组时,只能作为全局数组。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/44380
推荐阅读
相关标签
  

闽ICP备14008679号