当我们需要申请一个数组它的大小却是变量时,有如下解决方案。
1.通过变量直接申请数组
int a;
cin<<a;
int b[a];
这种写法无疑是最简单的,但是注意,只有比较现代的编译器支持这项功能,例如clion的minGw,Dev c++也支持这种写法。(可能是现代编译器针对它进行了特殊优化)但是这种写法存在着缺陷,即编译器应该在编译期就确定数组的大小,而不是运行期。为了安全性,vs并不支持这种写法,那么遇见了这种问题怎么解决呢?
2.运用malloc或者new动态申请一个数组
写法如下
int a;
cin<<a;
int* b;
b=(int*)malloc(a*sizeof(int))
其中malloc是一个函数,用来分配相应大小的内存,注意点有三。一是使用时需要引用#include<malloc>头文件。二是两个括号的问题,第一个括号为强制类型转换,例如此例的b,是int型的指针,所以第一个括号也的是int*,第二个括号是我们需要的动态分配的内存大小,sizeof(int)求出来的是一个int类数据的大小,我们需要a个这样大小的数组成的数组,所以a乘上它。三是动态分配的内存需要自己进行管理,malloc头文件提供了free这个函数来释放掉我们申请的内存,来防止内存爆炸,用法如下
free(b);
这样就释放了我们为b这个数组申请的内存。当只需要分配几个数组的时候不用释放,但是如果用到动态内存的地方很多的时候,就要注意内存管理了。
3.给定最大值
假设数据量最大为10000,写法如下
int a[10000]
/*或者*/
#define MaxSize 10000//写在主函数之前,using下面,是宏定义
int a[Maxsize];
好处也是好写,坏处是会浪费大量空间,实际开发时会导致内存爆炸,不过由于是静态的,在我们写算法题的时候很好用。