对宏定义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
相关产品推荐
相关产品推荐

