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

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

  •  
  •   xieranmaya · 2013-11-15 17:44:50 +08:00 · 4726 次点击
    这是一个创建于 4030 天前的主题,其中的信息可能已经有所发展或是发生改变。
    记得我上大学的时候这么个写法是不行的啊
    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
    ritksm
        1
    ritksm  
       2013-11-15 17:47:32 +08:00
    C99标准引入的- -老早的事情了...
    lotem
        2
    lotem  
       2013-11-15 17:48:43 +08:00
    c99 variable-length arrays
    txx
        3
    txx  
       2013-11-15 17:52:15 +08:00
    很早的事情了 就是编译的时候丢栈顶....不推荐的做法...
    xieranmaya
        4
    xieranmaya  
    OP
       2013-11-15 17:52:40 +08:00
    @ritksm 啊,真是这样吗,尼马我上大学时都07年了老师也没告诉我可以这么写啊啊啊啊
    txx
        5
    txx  
       2013-11-15 17:53:36 +08:00
    发现楼主是 大山中学的?
    xieranmaya
        6
    xieranmaya  
    OP
       2013-11-15 17:54:46 +08:00
    @txx 说话能说一下这个是怎么实现的吗,会不会是编译前给重写成了
    int *a;
    a = malloc(...);
    这样?
    xieranmaya
        7
    xieranmaya  
    OP
       2013-11-15 18:00:10 +08:00
    @txx 不是我,是我妹子
    skydiver
        8
    skydiver  
       2013-11-15 18:02:10 +08:00
    @xieranmaya malloc是堆上分配的空间吧。应该不一样
    txx
        9
    txx  
       2013-11-15 18:03:45 +08:00
    不不不不不
    它实际上还是使用的栈空间而不是堆空间...malloc 走的是堆空间..
    他编译的时候 就把这个变量丢到栈顶.. 然后根据n是多少 划掉相应的空间
    如果n过大直接 stackoverflow 而且对于一般程序而言 栈空间远远小于堆空间的

    所以不推荐这个做法


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

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