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

2017-01-20 10:40:06 +08:00
 diangdiang

这段代码在 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;

}

3608 次点击
所在节点    程序员
29 条回复
diangdiang
2017-01-20 10:43:18 +08:00
实在没搞懂,求别沉
erenno1
2017-01-20 10:45:55 +08:00
猜测是编译器做了优化了,你可以尝试下 main 函数里使用 for 循环对 n 赋值,估计就编译不了了
skydiver
2017-01-20 10:47:27 +08:00
C11 支持可变长数组。
结贴。
enenaaa
2017-01-20 10:47:28 +08:00
c99 标准, 变长数组。
skydiver
2017-01-20 10:47:46 +08:00
@skydiver 应该是 C99 就支持了…
assassinpig
2017-01-20 10:51:13 +08:00
编译器帮你忙 你换个 vc 编译器试试看
diangdiang
2017-01-20 10:55:26 +08:00
@编译时没用 c11 选项,看来我一直误解了,不知道以前是从哪里看到的,静态数组只能用常量指定大小。
多谢各位
azh7138m
2017-01-20 10:56:44 +08:00
4 楼说得对
Variable-length arrays
http://en.cppreference.com/w/c/language/array
rogerchen
2017-01-20 11:13:22 +08:00
@diangdiang
这是 gcc 在 C89/C90 年代的私有扩展,您可能是非标准编译器的受害者。
gcc 在 4.X 年代的默认标准就是 gnu90 (就是这么任性)。
rogerchen
2017-01-20 11:14:32 +08:00
saintaugustinus
2017-01-20 11:17:13 +08:00
标准是 C99 开始支持 VLA
但是 gcc 是一直都支持 VLA
http://stackoverflow.com/questions/4159746/variable-length-arrays-in-c89
diangdiang
2017-01-20 11:20:19 +08:00
@rogerchen 涨知识了。 也就是说这个特性不是 ISO C 标准的,只是 gcc 自己的扩展,别的 c 编译器如 vc 或者 clang 有可能不支持?
diangdiang
2017-01-20 11:22:24 +08:00
@saintaugustinus 这样啊,多谢了
irenicus
2017-01-20 11:48:19 +08:00
gcc 的特性
以前我给一个同事说 c 语言不能在函数里定义函数,同事不信,写了一个然后 gcc 编译通过了。。。
后来才知道这只是 gcc 的特性
holy_sin
2017-01-20 11:49:11 +08:00
楼主被谭浩强害了
nicevar
2017-01-20 11:53:28 +08:00
学过汇编的话,直接看编译产生的汇编代码
bboysoul
2017-01-20 12:14:00 +08:00
我也考虑过这个问题
hx1997
2017-01-20 12:55:08 +08:00
哈哈哈哈哈哈哈,谭浩强,我们过去的那学期学他的第四版,看到的时候都无语了(虽然我也没怎么看
Lonely
2017-01-20 13:03:22 +08:00
最近看 CSAPP ,正好看到有提到说是 ISO C99 允许数组的长度是表达式
kokutou
2017-01-20 13:10:11 +08:00
楼主可能是谭浩强的受害者。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/335778

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX