各位大大看看这段 c 代码有什么问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
diangdiang
V2EX    程序员

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

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

    这段代码在 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     Solana     5801 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 02:54 PVG 10:54 LAX 19:54 JFK 22:54
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86