//偶然看到一个题,然后就大胆试了一试,然后这一试好像试出了问题 //compiler:GCC #include<iostream> #include<typeinfo> #include<stdio.h> using namespace std; void func(int n) { int arr[n]; //如果在这里初始化int arr[n]={0},编译报错,换成下面赋值就相安无事了 for(int i=0;i<n;++i) arr[i]=i; //output for(int i=0;i<n;++i) cout<<arr[i]; } int main() { func(7); //输出0123456 cout<<endl; //上面的n是通过参数传递的, //那么主函数里面试试,这次数组大小直接反正声明处 int n=10; //同样,在这里初始化数组会提示:变大小的数组不能初始化?!!还有变大小的数组!!? //variable-sized object 'arr' may not be initialized. int arr[n]; //write in data for(int i=0;i<n;++i) arr[i]=i; //output for(int i=0;i<n;++i) cout<<arr[i]; //输出0123456789 //好吧,感觉至此三观尽毁 //然而,如果用typeid去识别arr[n]的类型,编译错误 //cout<<typeid(arr).name()<<endl; //但是这样是可以的,输出A10_i,可以识别。 //说明int n=10,arr[n]和int a[10],二者并不是同一类型 int a[10]; cout<<typeid(a).name()<<endl; }
私以为:
数组的声明,大小必须是确定的,比如int arr[10],或者大小是可以从初始化值推出的,比如 char charr="12345"。正是因为数组的这个局限性,才有了动态内存分配的个东西。但是,上面的运行情况让我就搞不懂了,数组的大小都可以是个变量,那还要动态内存分配何用??这倒还省去了手动释放的麻烦。那么new,delete是要丢掉饭碗了吗??
也或者.......也或者是我上面什么地方犯了低级错误??!!
![]() | 1 XiaoxiaoPu 2015-06-24 19:17:44 +08:00 via Android 1. 这是柔性数组,在栈上动态分配空间实现 2. 作用域和生命周期仅限函数执行周期内,函数返回即销毁 3. 栈上不能分配太大的空间 |
![]() | 2 lotem 2015-06-24 19:22:28 +08:00 C99 variable-length array |
3 sumhat 2015-06-24 19:26:05 +08:00 C99 特性,被 GCC 移植到了 C++,详见: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Variable-Length.html#Variable-Length |
![]() | 4 codercai OP @XiaoxiaoPu 我试了一下,数组大小500000都没有问题,也就是1.6M多空间了,基本已经达到了windows下的栈大小的上限。 |
![]() | 5 codercai OP |
![]() | 6 codercai OP 不过话说,这个代码的缩进神马的,支持的还不是很好 |
![]() | 7 codercai OP 话才刚刚说完,一刷新就重新排版过了........是人为在操作吗?辛苦了。 |
![]() | 9 omph 2015-06-25 01:50:10 +08:00 把编译参数换成这个 g++ -Wpedantic -ansi,有如下警告: 2.cpp: In function ‘void func(int)’: 2.cpp:8:14: warning: ISO C++ forbids variable length array ‘arr’ [-Wvla] |
10 abscon 2015-06-25 09:15:42 +08:00 楼上已指出stack关键字,关于动态分配我想补充一点:楼主难道只用 delete[] 不用 delete 么。 |
![]() | 11 codercai OP @abscon 额.....貌似你整偏了,delete[],delete当然是视具体情况而定了,但是没有明白层主的具体意思,详细点呢? |
12 abscon 2015-06-25 09:56:49 +08:00 @codercai 因为你的主贴的论证过程是这样的: 由于可以用new之外的方式(定义时使用变量)动态定义数组,所以new可以下课了。 你说的是“new可以下课了”,并没有限定是分配数组还是只分配一个变量,所以我说你平时用new是否全都是在动态分配数组,以至于忘记提到了还有只分配一个变量的情况。 |
13 xylophone21 2015-06-25 10:43:37 +08:00 同意@abscon的说法,临时需要一小段内存(本例的情况) 只是new的小部分作用之一。 |