这个输出让我三观尽毁............如此一来,要动态分配何用? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codercai
V2EX    C

这个输出让我三观尽毁............如此一来,要动态分配何用?

  •  
  •   codercai 2015-06-24 19:08:44 +08:00 2363 次点击
    这是一个创建于 3761 天前的主题,其中的信息可能已经有所发展或是发生改变。
    //偶然看到一个题,然后就大胆试了一试,然后这一试好像试出了问题 //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是要丢掉饭碗了吗??

    也或者.......也或者是我上面什么地方犯了低级错误??!!

    13 条回复    2015-06-25 10:43:37 +08:00
    XiaoxiaoPu
        1
    XiaoxiaoPu  
       2015-06-24 19:17:44 +08:00 via Android
    1. 这是柔性数组,在栈上动态分配空间实现
    2. 作用域和生命周期仅限函数执行周期内,函数返回即销毁
    3. 栈上不能分配太大的空间
    lotem
        2
    lotem  
       2015-06-24 19:22:28 +08:00
    C99 variable-length array
    sumhat
        3
    sumhat  
       2015-06-24 19:26:05 +08:00
    codercai
        4
    codercai  
    OP
       2015-06-24 19:29:39 +08:00
    @XiaoxiaoPu
    我试了一下,数组大小500000都没有问题,也就是1.6M多空间了,基本已经达到了windows下的栈大小的上限。
    codercai
        5
    codercai  
    OP
       2015-06-24 19:32:01 +08:00
    @sumhat
    @lotem
    额..........大惊小怪,孤陋寡闻使然也.........惭愧惭愧......
    拜谢二位了~~~
    我试了一下,数组分配到500000都没有问题,差不多就是1.6M,几乎达到了windows的栈大小的上限了,这么看还是不小的呢。
    codercai
        6
    codercai  
    OP
       2015-06-24 19:33:55 +08:00
    不过话说,这个代码的缩进神马的,支持的还不是很好
    codercai
        7
    codercai  
    OP
       2015-06-24 19:35:08 +08:00
    话才刚刚说完,一刷新就重新排版过了........是人为在操作吗?辛苦了。
    codercai
        8
    codercai  
    OP
       2015-06-24 19:36:21 +08:00
    @lotem 额.....孤陋寡闻了,感谢感谢
    omph
        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]
    abscon
        10
    abscon  
       2015-06-25 09:15:42 +08:00
    楼上已指出stack关键字,关于动态分配我想补充一点:楼主难道只用 delete[] 不用 delete 么。
    codercai
        11
    codercai  
    OP
       2015-06-25 09:21:28 +08:00
    @abscon
    额.....貌似你整偏了,delete[],delete当然是视具体情况而定了,但是没有明白层主的具体意思,详细点呢?
    abscon
        12
    abscon  
       2015-06-25 09:56:49 +08:00
    @codercai 因为你的主贴的论证过程是这样的:

    由于可以用new之外的方式(定义时使用变量)动态定义数组,所以new可以下课了。

    你说的是“new可以下课了”,并没有限定是分配数组还是只分配一个变量,所以我说你平时用new是否全都是在动态分配数组,以至于忘记提到了还有只分配一个变量的情况。
    xylophone21
        13
    xylophone21  
       2015-06-25 10:43:37 +08:00
    同意@abscon的说法,临时需要一小段内存(本例的情况) 只是new的小部分作用之一。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4064 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 52ms UTC 05:22 PVG 13:22 LAX 22:22 JFK 01:22
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86