可变参数的理解

Posted taek

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可变参数的理解相关的知识,希望对你有一定的参考价值。

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

 

 

 

 

 

 参考这里

以上是关于可变参数的理解的主要内容,如果未能解决你的问题,请参考以下文章

C/C++可变参数模版和函数指针的结合

Scala函数使用可变参数

理解 Python 中的可变参数 *args 和 **kwargs:

可变参数的理解

C/C++中的可变参数和可变参数模板

Python中函数的参数定义和可变参数