va_list,va_start,va_end分析

本文详细介绍了如何使用VSprintf函数处理C语言中的可变参数列表,并通过具体实例展示了如何利用va_list类型来访问传递给函数的多个不定参数。

void dprintf( char * format, ...)
{
    static char buf[1024];
    va_list args;    // typedef char *  va_list;
    va_start( args, format ); //#define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )
    vsprintf( buf, format, args );
    va_end( args);   //#define va_end(ap)      ( ap = (va_list)0 )
    OutputDebugStringA( buf);
    printf("%s", buf);
}

其中ap = (va_list)&v + _INTSIZEOF(v) 在win32上 _INTSIZEOF(v) = 4
v是字符串的首地址,那么&v是个二级指针,即v在参数栈的地址, 那么 &v + 4 就是下一个参数在栈中的地址了
args就指向了format后面的参数,正好使用vsprintf
//////
int vsprintf( char *buffer, const char *format, va_list argptr );
int vswprintf( wchar_t *buffer, const wchar_t *format, va_list argptr );
Parameters
buffer
Storage location for output
format
Format specification
argptr
Pointer to list of arguments
/////////

验证程序:

void test( int a ,int c, int j)
{
 printf("Stack Pointer: &a = %x, &c = %x ,&j = %x.........../n", &a, &c,&j);
}

void main()
{
 int a, b, c,d,e,f, g,h,i,j;
 printf(" in Var Stack : &a = %x, &c = %x , &j = %x.........../n", &a, &c,&j);
 test( a, c, j);

}

/*Output
in Var Stack : &a = 13ff7c, &c = 13ff74 , &j = 13ff58...........
Stack Pointer: &a = 13ff00, &c = 13ff04 ,&j = 13ff08...........

*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值