在c中从堆栈中获取参数

时间:2018-06-12 18:09:48

标签: c

我刚刚开始学习c而我正在尝试创建一个函数,当我知道所有参数来自同一类型时,它从堆栈中获取它的参数,但它只适用于int。

这就是我所做的:

void Test1(double first_arg, ...)
{
    double *a = &first_arg;
    printf("arg[0]: %f\narg[1]: %f \narg[2]: %f\n", a[0], a[1], a[2]);
}
void Test2(int first_arg, ...)
{
    int *a = &first_arg;
    printf("arg[0]: %d\narg[1]: %d \narg[2]: %d\n", a[0], a[1], a[2]);
}
int main()
{
    printf("Test1:\n");
    Test1(1.0, 2.0, 3.0);
    printf("\nTest2:\n");
    Test2(1, 2, 3);
    return 0;
}

Console:
Test1:
arg[0]: 1.000000
arg[1]: 0.000000
arg[2]: 0.000000

Test2:
arg[0]: 1
arg[1]: 2
arg[2]: 3

我在这里缺少什么?我该怎么做才能解决这个问题。

1 个答案:

答案 0 :(得分:3)

参数传递给函数的方式取决于实现。要以可移植的方式读取变量参数,您需要使用stdarg函数族。

#include <stdio.h>
#include <stdarg.h>

void Test1(double first_arg, ...)
{
    printf("arg[0]=%f\n", first_arg);

    va_list ap;
    va_start(ap, first_arg);
    double arg1 = va_arg(ap, double);
    printf("arg[1]=%f\n", arg1);
    double arg2 = va_arg(ap, double);
    printf("arg[2]=%f\n", arg2);
    va_end(ap);
}

int main()
{
    printf("Test1:\n");
    Test1(1.0, 2.0, 3.0);
    return 0;
}