You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言可变长数组声明顺序导致斐波那契输出错误问题求解

问题核心原理

你遇到的是C语言变长数组(VLA, Variable Length Array)的初始化规则问题,本质是未定义行为导致的运行异常:

  • 变长数组是C99标准引入的特性,它的数组长度在声明语句执行时就会被固定下来,不会随后续长度变量的修改自动更新。
  • 第一段代码逻辑正确:你先通过scanf给n赋了有效输入值,再声明int fibs[n],此时数组长度就是你输入的有效值,后续读写都符合预期。
  • 第二段代码的问题:你在声明n的同时就声明了fibs[n],此时n是未初始化的栈上局部变量,存储的是随机垃圾值,数组fibs的长度会被直接设置为这个随机值,和你后续用scanf给n赋的10没有任何关系。

如果此时n的随机垃圾值刚好≤2,那你写的for(int i = 2; i < n; i++)循环判断条件直接不成立,循环完全不会执行,就只会输出前两个手动赋值的0 1,和你遇到的现象完全吻合。
同时这种操作还伴随数组越界风险:如果fibs的实际长度小于2,你对fibs[0]、fibs[1]的赋值已经属于越界访问,属于C标准定义的未定义行为,运行时可能出现输出异常、程序崩溃等任意结果。
编译器不会报错是因为语法层面符合C标准要求,编译器不会主动检查局部变量的初始化状态,因此只有运行时会出现异常结果。

内容的提问来源于stack exchange,提问作者Ishaan Vatus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:51:03