//偶然看到一个题,然后就大胆试了一试,然后这一试好像试出了问题
//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的小部分作用之一。
|