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

对宏定义va_arg中[-1]指针寻址操作的技术疑问

解读va_arg宏里的[-1]指针用法

先把你提到的宏定义贴出来:

#define va_arg(list,mode) ( (mode *) ( list += sizeof(mode) ) [-1] )

咱们一步一步拆这个宏的逻辑:

  • 首先执行list += sizeof(mode):把list指针往后移动一个mode类型的字节数,这样list就指向了下一个可变参数的位置(方便后续继续调用va_arg)。
  • 接着把移动后的list强制转换成mode*类型的指针:让编译器把这个指针当成指向mode类型数据的指针来处理。
  • 最后用[-1]:这是C语言里合法的指针写法,p[-1]完全等价于*(p - 1)。这里就是取移动后的指针往前退一个mode大小的位置上的数据——也就是原本list指向的当前参数。

你猜的没错,它确实指向的是当前要取的那个mode类型的值。至于指针能不能指向这个位置,只要这个位置的内存是合法的(这里可变参数存在栈上,是程序合法分配的内存区域),就完全没问题。C语言里允许指针做这样的算术运算,只要最终访问的内存是有效的就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:25:34