当前位置: 首页 > news >正文

函数的可变参数传参

一.前言

可变参数传参是C语言的一种高级用法。


二. 用法示例

求任意个 int 类型数据的平均值。

点击查看代码
double avg_int(int count, ...)
{va_list ap;                   /* 2. 声明参数列表变量 */int sum = 0;va_start(ap, count);          /* 3. 用最后一个固定参数初始化 */for (int i = 0; i < count; ++i)sum += va_arg(ap, int);   /* 4. 逐个取 int 数据累加 */va_end(ap);                   /* 5. 清理 */return count ? (double)sum / count : 0.0;
}

三.参数布局

若调用函数avg_int(3, 10, 20, 30),在x86-64 System V ABI(Linux/macOS 64 位)典型布局(简化):

高地址
+-----------+
| 30 | <-- 第四个实参
+-----------+
| 20 | <-- 第三个实参
+-----------+
| 10 | <-- 第二个实参
+-----------+
| 3 | <-- 第一个实参(count)
+-----------+
| ret addr |
低地址

三个宏的真身(简化版,glibc 实现)

点击查看代码
typedef char *va_list;              /* 只是字节指针 */#define va_start(ap, last)          \((ap) = (char *)&(last) + sizeof(last))#define va_arg(ap, type)            \(*(type *)((ap) += sizeof(type), (ap) - sizeof(type)))#define va_end(ap)                  \((ap) = (char *)0)
被调用函数看到的栈/寄存器里,这些值连续排布,顺序与实参顺序一致。
http://www.jsqmd.com/news/34628/

相关文章:

  • P12366 [蓝桥杯 2022 省 Python B] 数位排序
  • 重组蛋白表达技术|HEK293细胞蛋白表达|高效重组蛋白生产服务
  • CJI8运行查询没有数据
  • Para 集训
  • RK3576在智能工程机械中的应用|三屏八摄AI视觉解决方案
  • 贪心,排序,二分,分治
  • python01
  • AI Compass前沿速览:Cursor 2.0、Firefly Image5、Agent HQ 、LongCat-Video、Kimi-k2 Thinking
  • 25.11.7联考题解
  • 浅谈dp中的最优化、计数问题
  • CF715B
  • [NOIP 2001 提高组] 一元三次方程求解
  • EPnP算法学习随笔
  • 毒盘未转存仅支持在线观看30s
  • P14322 「ALFR Round 11」E 空崎ヒナ 小结
  • AI元人文:理论自省与客观评估
  • [Element Plus 组件库的官方 API 参考文档] 的部分内容的解释
  • ZK笔记
  • 完整教程:《以 Trae 为桥:高效集成豆包 1.6 API 的实践与思考》
  • 完整教程:Labview项目01:标准可配置序列测试框架
  • 20251107
  • 从零开始实现简易版Netty(十) MyNetty 通用编解码器解决TCP黏包/拆包问题
  • [Python刷题记录]-除自身以外数组的乘积-普通数组-中等
  • Transformer Decoder 中序列掩码(Sequence Mask / Look-ahead Mask) - 详解
  • codeforces
  • P9785 [ROIR 2020] 对常规的斗争 (Day1) 题解
  • 实用指南:超越CNN和Transformer!Mamba结合多模态统领图像任务!
  • Docker镜像建立【MSSQL2022】
  • 闪回咒 | NOIP 2025 游记
  • 灰度发布