print2(3, 100, 1, 2, 3)
输出的是1 2 3加上一位不确定值
因为va_start(vl, n)这一步理论上可以得到以a开头的va_list指针,但实际上由于编译器优化,它的效果和va_start(vl, a)是相同的
这一点,你可以打印出指针地址来确定一下
从你的代码推测,你是想让print2打印出后四个参数,包括a在内
即 100 1 2 3
如果是这样 可以用另一种方式做到
print2中,不要调用va_start
而是直接 vl=&a
如下
void print2(int n, int a, ...)
{
va_list vl
//va_start(vl, n)//使用倒数第二个有名变量
vl = &a//编译器想优化 不让。 直接强势插入
vprint(n+1, vl)
va_end(vl)
}
可以试一下是否是你需要的效果。 如果不是 再追问
&fmt是第一个参数的首地址。根据你后面的代码来看,你传递的第一个参数是一个字符串,即%d %d %s\n。你凭什么要认为你的第一个参数是4呢?奇怪……
&操作符这里是取fmt的地址,没有涉及引用啊?
转化成char*的意思估计是为了强调你第一个传过去的参数是字符串吧?这种叫做“类型转换”,不会改变&fmt里面的数据的,所以肯定不会指向错误的地址,瀑布汗。
最后,+sizeof(fmt)的目的需要肯定,是为了打印出4这个字符来。那么这句话意思就很明白了:首先,将fmt强制转换为char*类型,然后呢,因为fmt已经是char*了,所以移动一个char*那么长的“位置”,来到存储“4”这个数字的地方……再多说一句:你程序里变长参数fmt的结构是“char*,int,int,char*”这样子的,两个char*分别指向两个字符串。
希望你看明白了:D