在C语言中从堆栈获取参数

3

我刚开始学习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
栈?这被称为可变参数函数。我猜这是未定义的行为。查看文档以了解如何正确使用它。 - Christopher Schneider
1个回答

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;
}

有没有不使用stdarg的方法?我更关心它是如何工作的。 - Tᴏᴍᴇʀ Wᴏʟʙᴇʀɢ
1
@TᴏᴍᴇʀWᴏʟʙᴇʀɢ 你需要深入了解特定编译器的内部,以了解其工作原理。虽然整数参数通常是通过栈传递的,但浮点参数往往是通过浮点寄存器传递的。你需要编写一些汇编代码来实现你想要的。 - dbush

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接