• 请不要在回答技术问题时复制粘贴 AI 生成的内容
diangdiang
V2EX  ›  程序员

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

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