V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
diangdiang
V2EX  ›  程序员

各位大大看看这段 c 代码有什么问题

  •  
  •   diangdiang · Jan 20, 2017 · 4354 views
    This topic created in 3390 days ago, the information mentioned may be changed or developed.

    这段代码在 gcc 下可以通过,为什么声明数组的时候,数组大小可以是变量呢,一直都以为声明数组大小只能是常量,除了使用动态内存分配。

    int fib(int n) {

    if (n == 0)
        return 0;
    if (n == 1)
        return 1;
    
    int f[n+1];
    int i;
    f[0] = 0; f[1] = 1;
    for (i = 2; i <= n; i++)
        f[i] = f[i-1] + f[i-2];
    return f[n];
    

    }

    int main () {

    int n = 9;
    printf("fib number is %d\n", fib(n));
    return 0;
    

    }

    29 replies    2017-01-21 15:48:31 +08:00
    diangdiang
        1
    diangdiang  
    OP
       Jan 20, 2017
    实在没搞懂,求别沉
    erenno1
        2
    erenno1  
       Jan 20, 2017
    猜测是编译器做了优化了,你可以尝试下 main 函数里使用 for 循环对 n 赋值,估计就编译不了了
    skydiver
        3
    skydiver  
       Jan 20, 2017 via Android
    C11 支持可变长数组。
    结贴。
    enenaaa
        4
    enenaaa  
       Jan 20, 2017   ❤️ 1
    c99 标准, 变长数组。
    skydiver
        5
    skydiver  
       Jan 20, 2017 via Android
    @skydiver 应该是 C99 就支持了…
    assassinpig
        6
    assassinpig  
       Jan 20, 2017
    编译器帮你忙 你换个 vc 编译器试试看
    diangdiang
        7
    diangdiang  
    OP
       Jan 20, 2017
    @编译时没用 c11 选项,看来我一直误解了,不知道以前是从哪里看到的,静态数组只能用常量指定大小。
    多谢各位
    azh7138m
        8
    azh7138m  
       Jan 20, 2017 via Android
    4 楼说得对
    Variable-length arrays
    http://en.cppreference.com/w/c/language/array
    rogerchen
        9
    rogerchen  
       Jan 20, 2017   ❤️ 2
    @diangdiang
    这是 gcc 在 C89/C90 年代的私有扩展,您可能是非标准编译器的受害者。
    gcc 在 4.X 年代的默认标准就是 gnu90 (就是这么任性)。
    rogerchen
        10
    rogerchen  
       Jan 20, 2017   ❤️ 1
    saintaugustinus
        11
    saintaugustinus  
       Jan 20, 2017 via iPhone   ❤️ 1
    标准是 C99 开始支持 VLA
    但是 gcc 是一直都支持 VLA
    http://stackoverflow.com/questions/4159746/variable-length-arrays-in-c89
    diangdiang
        12
    diangdiang  
    OP
       Jan 20, 2017
    @rogerchen 涨知识了。 也就是说这个特性不是 ISO C 标准的,只是 gcc 自己的扩展,别的 c 编译器如 vc 或者 clang 有可能不支持?
    diangdiang
        13
    diangdiang  
    OP
       Jan 20, 2017
    @saintaugustinus 这样啊,多谢了
    irenicus
        14
    irenicus  
       Jan 20, 2017
    gcc 的特性
    以前我给一个同事说 c 语言不能在函数里定义函数,同事不信,写了一个然后 gcc 编译通过了。。。
    后来才知道这只是 gcc 的特性
    holy_sin
        15
    holy_sin  
       Jan 20, 2017   ❤️ 2
    楼主被谭浩强害了
    nicevar
        16
    nicevar  
       Jan 20, 2017
    学过汇编的话,直接看编译产生的汇编代码
    bboysoul
        17
    bboysoul  
       Jan 20, 2017
    我也考虑过这个问题
    hx1997
        18
    hx1997  
       Jan 20, 2017
    哈哈哈哈哈哈哈,谭浩强,我们过去的那学期学他的第四版,看到的时候都无语了(虽然我也没怎么看
    Lonely
        19
    Lonely  
       Jan 20, 2017
    最近看 CSAPP ,正好看到有提到说是 ISO C99 允许数组的长度是表达式
    kokutou
        20
    kokutou  
       Jan 20, 2017 via Android
    楼主可能是谭浩强的受害者。。。
    langjiyuan
        21
    langjiyuan  
       Jan 20, 2017
    谭浩强+1
    wohenyingyu02
        22
    wohenyingyu02  
       Jan 20, 2017 via iPhone
    想问问,如果吧 int n=9 去掉,从 main 第一个参数里赋值 int ,还能通过编译么……
    congeec
        23
    congeec  
       Jan 20, 2017 via iPad
    @skydiver 准确的说是 C99 支持。 C11 成编译器可选项了
    ovear
        24
    ovear  
       Jan 20, 2017
    c99 的新特性哈哈哈, c prime plus 有讲 hhh
    faywong8888
        25
    faywong8888  
       Jan 20, 2017 via iPhone
    c99 标准特性
    owt5008137
        26
    owt5008137  
       Jan 21, 2017 via Android
    c99 的变长数组, gcc 支持但是 vc 不支持,现在很多教科书都是基于 vc ( 6 )的
    这么搞如果 n 比较大容易爆栈
    斐波那契数列可以用矩阵相乘把时间复杂度优化到 O(log(n))
    amet
        27
    amet  
       Jan 21, 2017
    @diangdiang 似乎用到过, clang 好像是支持的。比较新的主流编译器都可以吧。
    amet
        28
    amet  
       Jan 21, 2017
    @amet 补充一下,可能要用 `std=c99` 之类的参数指定一下。
    ghSimon
        29
    ghSimon  
       Jan 21, 2017
    只写 gcc -std=c89 默认不会关闭 gcc 的那些扩展,必须还要再加上-pedantic 表示严格参照 ISO C
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2559 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 72ms · UTC 14:59 · PVG 22:59 · LAX 07:59 · JFK 10:59
    ♥ Do have faith in what you're doing.