V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codercai
V2EX  ›  C

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

  •  
  •   codercai · 2015-06-24 19:08:44 +08:00 · 1937 次点击
    这是一个创建于 3448 天前的主题,其中的信息可能已经有所发展或是发生改变。
    //偶然看到一个题,然后就大胆试了一试,然后这一试好像试出了问题
    //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   ·   实用小工具   ·   2780 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:44 · PVG 19:44 · LAX 03:44 · JFK 06:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.