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

2015-06-24 19:08:44 +08:00
 codercai
//偶然看到一个题,然后就大胆试了一试,然后这一试好像试出了问题
//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是要丢掉饭碗了吗??

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

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

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

你说的是“new可以下课了”,并没有限定是分配数组还是只分配一个变量,所以我说你平时用new是否全都是在动态分配数组,以至于忘记提到了还有只分配一个变量的情况。
xylophone21
2015-06-25 10:43:37 +08:00
同意@abscon的说法,临时需要一小段内存(本例的情况) 只是new的小部分作用之一。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/200880

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX