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

我擦,C/C++ 里支持 int a[n]; 这种写法了???

  •  
  •   xieranmaya · 2013-11-15 17:44:50 +08:00 · 3452 次点击
    这是一个创建于 1983 天前的主题,其中的信息可能已经有所发展或是发生改变。
    记得我上大学的时候这么个写法是不行的啊
    C里要用malloc
    C++里要用new
    为毛现在可以这么写啊?是新标准的缘故?
    大家可以拿这个代码在SOJ.ME上去测http://soj.me/1134这个题目
    看while下面的两行代码

    #include <stdio.h>
    #include <stdlib.h>

    void main() {
    int n,s;
    int i = 0;
    int j = 1;
    int t = 1;
    int flag = 1;

    while(scanf("%d%d",&n,&s) && n != 0){
    int a[n];
    int b[n];
    for(i=0; i<n; i++){
    scanf("%d%d", &a[i], &b[i]);
    }

    for(i=0; i<n; i++){
    for(j=i+1; j<n; j++){
    if(b[i] >= b[j]){
    t = b[i];
    b[i] = b[j];
    b[j] = t;
    t = a[i];
    a[i] = a[j];
    a[j] = t;
    }
    }
    }

    for(j=0; j<n; j++){
    if(s < b[j]){
    flag = 0;
    break;
    }
    s = s+a[j];
    }
    if(flag == 0){
    printf("NO\n");
    }else{
    printf("YES\n");
    }
    }
    exit(0);
    }
    21 回复  |  直到 1970-01-01 08:00:00 +08:00
        1
    ritksm   2013-11-15 17:47:32 +08:00
    C99标准引入的- -老早的事情了...
        2
    lotem   2013-11-15 17:48:43 +08:00
    c99 variable-length arrays
        3
    txx   2013-11-15 17:52:15 +08:00
    很早的事情了 就是编译的时候丢栈顶....不推荐的做法...
        4
    xieranmaya   2013-11-15 17:52:40 +08:00
    @ritksm 啊,真是这样吗,尼马我上大学时都07年了老师也没告诉我可以这么写啊啊啊啊
        5
    txx   2013-11-15 17:53:36 +08:00
    发现楼主是 大山中学的?
        6
    xieranmaya   2013-11-15 17:54:46 +08:00
    @txx 说话能说一下这个是怎么实现的吗,会不会是编译前给重写成了
    int *a;
    a = malloc(...);
    这样?
        7
    xieranmaya   2013-11-15 18:00:10 +08:00
    @txx 不是我,是我妹子
        8
    skydiver   2013-11-15 18:02:10 +08:00
    @xieranmaya malloc是堆上分配的空间吧。应该不一样
        9
    txx   2013-11-15 18:03:45 +08:00
    不不不不不
    它实际上还是使用的栈空间而不是堆空间...malloc 走的是堆空间..
    他编译的时候 就把这个变量丢到栈顶.. 然后根据n是多少 划掉相应的空间
    如果n过大直接 stackoverflow 而且对于一般程序而言 栈空间远远小于堆空间的

    所以不推荐这个做法


    http://stackoverflow.com/questions/448844/variable-sized-arrays-in-c
        10
    xieranmaya   2013-11-15 18:05:16 +08:00
    @txx 高手哇~~解惑了~~
        11
    xdeng   2013-11-15 18:10:27 +08:00
    malloc 和 new

    malloc 只管分配内存
        12
    xdeng   2013-11-15 18:11:48 +08:00
    不小心 按回车了 new 不单只分配内存 如果是对象还会调用 构造函数 而 malloc一个对象 不会。。。同理 delect 和 free 也不一样。。。
        13
    xieranmaya   2013-11-15 18:17:24 +08:00
    @xdeng 嗯嗯,new 和 malloc 是有区别的~
        14
    Golevka   2013-11-15 18:53:46 +08:00
    C99有VLA, C++14才把VLA正式纳入标准, 但是许多支持C++11的编译器都支持VLA作为自己的扩展特性.
        15
    Ricepig   2013-11-16 01:20:08 +08:00 via iPhone
    lz大学还在用turbo c吗?哈哈
        16
    Ricepig   2013-11-16 01:21:04 +08:00 via iPhone
    另外,小心stack overflow,这不是那个网站哦
        17
    treo   2013-11-16 17:39:49 +08:00
    ms的vs至今不支持vla
        18
    guchy2012   2013-11-16 20:29:19 +08:00
    C++里面把n设置为常量就可以这么用,而且是编译器行为。
        19
    xieranmaya   2013-11-18 11:09:15 +08:00
    @Ricepig 当年上大学的时候用的是VC6.0.。。。
        20
    yegle   2013-11-18 13:07:35 +08:00
    @txx 为什么是不推荐做法?有什么陷阱吗?
        21
    chisj   2013-11-18 14:52:34 +08:00
    @yegle 不小心可能导致栈溢出啊,txx9楼说了.
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3208 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 18ms · UTC 04:50 · PVG 12:50 · LAX 21:50 · JFK 00:50
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1