c中的printf中的参数就是典型的可变参数,参数不固定,那怎么获取呢
正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈
#include <stdio.h> #include <stdlib.h> #define __va_rounded_size(TYPE) (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) void test(int a, int b){ printf("a address is %x ", &a); printf("b address is %x ", &b); char* addr = (char*)&b ; printf("b values is %d ", *(int*)addr); addr = addr + sizeof(int); //这里如果是long, 那么a的值是0,但没报错 printf("a values is %d ", *(int*)addr); } int main(){ test(1,2); return 0; }
结果为
a address is 3e20571c
b address is 3e205718
b values is 2
a values is 1
明显b的地址要高于a, b先于a入栈
肯定知道b的地址,那么a的值 就是 *(int) (&b+sizeof(int))
参考这里