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

在C语言中调用函数时省略一个参数会发生什么?

旧式C函数声明与参数省略的那些坑

先声明:我完全清楚这种编程方式绝对不是什么良好实践——要是好奇我为啥要聊这个,看完核心问题的解析我会说明原因。

咱们直奔主题:

  • 在C语言的旧式(K&R风格)函数声明里,如果你这么写:int f(n, r) {…},这里的参数n和r会被默认推断为int类型。虽然现代编译器(比如GCC、Clang)几乎都会抛出警告,但咱们暂时先把警告关掉或者忽略。
  • 现在如果调用这个函数的时候,不管是意外还是故意省略一个参数,比如写 f(25);,你会发现GCC和Clang居然都能正常编译通过,但这里的问题可大了:

这属于未定义行为!因为旧式函数声明没有原型,编译器不会检查调用时的参数数量和类型是否匹配。程序运行时,会按照函数的调用约定去栈里读取第二个参数的值,但这个值根本没被传入,本质上是栈里的随机垃圾数据。这会导致什么后果?小到程序逻辑错乱、输出莫名其妙的结果,大到直接崩溃,甚至可能被利用来做安全攻击。

至于为啥要聊这种明显不规范的写法?其实是为了理解C语言早期的设计历史,以及现代编译器对老旧语法的兼容逻辑——虽然现在没人会在生产代码里这么写,但搞清楚这些细节,能帮你更深刻地理解C语言的类型系统和底层调用机制。

内容的提问来源于stack exchange,提问作者O.O.Balance

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:15:51