va_list,va_start,va_end分析

来源:互联网 发布:php saeautoloader 编辑:程序博客网 时间:2024/05/01 17:03

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...........

*/

 
原创粉丝点击