在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
相关产品推荐
相关产品推荐

