了解了下可变参函数的原理,这里记录下方便自己以后看
printf函数原型 int printf(const char *fmt, ...)
这里写个例子方便理解 printf("%s\n","hello");
函数传参参数压栈的方向是从右往左,也就是说当调用printf函数的时候,先是最右边的“hello”参数入栈,然后才是
“%s\n”,指针也是变量,也有地址,入栈入的是这两个指针的地址,栈是从高地址向低地址方向增长的。所以在栈内地址顺序
是 ("hello" 指针的地址 [ 高 ]) ->("%s\n"指针的地址 [ 低 ]),而“%s\n”的地址是知道的,就是 fmt参数的地址,用这个地址加上一个指针的长度就是传入的第一个参数的地址,也就是这里的“hello”的地址,所以 fmt+sizeof(char *)就是第一个参数,由于在同一系统中指针长度是固定的,这样就可以算出第2个,第3个以及后面的参数,再从fmt字符串中找到对应的%后面的字符,就能确定需要打印几个参数