首页 > 技术文章 > 可变参数的理解

taek 2017-09-08 01:12 原文

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\n", &a);
        printf("b address is %x\n", &b);

        char* addr = (char*)&b ;
        printf("b values is %d\n", *(int*)addr);

        addr = addr + sizeof(int);  //这里如果是long, 那么a的值是0,但没报错
        printf("a values is %d\n", *(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)) 

 

 

 

 

 

 参考这里

推荐阅读