码迷,mamicode.com
首页 > 其他好文 > 详细

可变参数的理解

时间:2017-09-08 10:00:24      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:规则   com   color   结果   address   www   res   call   可变参   

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

 

 

 

 

 

 参考这里

可变参数的理解

标签:规则   com   color   结果   address   www   res   call   可变参   

原文地址:http://www.cnblogs.com/taek/p/7492649.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!