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

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

  •  
  •   diangdiang · 2017-01-20 10:40:06 +08:00 · 3607 次点击
    这是一个创建于 2860 天前的主题,其中的信息可能已经有所发展或是发生改变。

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