可变参数处理--源码及分析

/*不定个数参数输入处理*/
#include <stdio.h>
#include <stdarg.h>
#include <string.h>

int  cmd(char *format,...);
int main(int argc,char* argv[])
{
cmd("%s,%s,%s,%s","hello","no","world","va_list");
}
int cmd(char *format,...)   //形参保存在栈中,这里的形参都是字符串,栈中保存的只是各个字符串的首地址,在
{              //本例中栈中保存了format的首地址和4个字符串的首地址,即栈中形参指针有5个。
char comd[256];       //形参指针在栈中存放方式:栈的存放为"栈顶低址栈底高址,形参从右到左入栈,先入栈进栈底"。
char *cmmd=NULL;   
int cnt;
va_list pa;             //va_list定义:typedef  char * va_list,即pa为一个char型指针。
va_start(pa,format);    //指针pa初始化,使pa指向format后面的第一个变参地址,这里就是"hello"的地址。
printf("pa:%s\n",pa);   //这里每次运行的打印都不一样,猜测是打印形参指针的地址。
printf("cmd step1:%s\n",format);  //打印format形参的值。
memset(comd,0,256);   //vsnprintf函数的format是输出格式,这里依然用形参的format格式,pa指向的是"hello"形参地址。
vsnprintf(comd,sizeof(comd),format,pa);  //这里会按照format格式读取pa开始的变量列表的形参,由于format中有4个%,所以会读取4个变量的指针指向的值。
printf("vsprintf1:%s\n",comd);
cmmd=va_arg(pa,char *);  //va_arg函数返回变量列表的下一个变量的地址,这里就是第二个形参变量"no"的地址。
printf("cmd step2:%s\n",cmmd);   //打印第一个变参参数
memset(comd,0,256);
vsnprintf(comd,sizeof(comd),format,pa);  //打印format格式的pa开始的变量列表指针指向的值,由于format中有4个%,所以会读取4个变量的指针指向的值。
printf("vsprintf2:%s\n",comd);    //这里最后一个由于不是传进来的形参变量的指针,所以是个随机值。
//printf("%s\n",*((char *)pa));
cmmd=va_arg(pa,char *);  //
printf("cmd step3:%s\n",cmmd);
memset(comd,0,256);
vsnprintf(comd,sizeof(comd),format,pa);
printf("vsprintf3:%s\n",comd); 
cmmd=va_arg(pa,char *);
printf("cmd step4:%s\n",cmmd);
memset(comd,0,256);
vsnprintf(comd,sizeof(comd),format,pa);
printf("vsprintf4:%s\n",comd);
va_end(pa);
}

作者: bluesky2254   发布时间: 2010-12-02