C 如何使用可变数量的参数来运行

C 如何使用可变数量的参数来运行,c,function,parameters,C,Function,Parameters,我有这个: long int addsquares(int n, ...) 如何访问参数? 我不能使用va_start和va_arg…使用数组并将每个参数存储在数组的一个单元格中 long int addsquares(int[] parameters) { for (int i = 0; i < parameters.length(); i++) { //Use current parameter: parameters[i] } } 这是c

我有这个:

long int addsquares(int n, ...) 
如何访问参数?
我不能使用va_start和va_arg…

使用数组并将每个参数存储在数组的一个单元格中

long int addsquares(int[] parameters)
{
    for (int i = 0; i < parameters.length(); i++)
    {
        //Use current parameter: parameters[i]
    }
}

这是c代码,但我认为它也适用于c。

如果你说你有一个可变函数,并且你不允许使用可变参数宏va_xxx,那么你必须自己重写这些宏的内容


除非您可以更改函数原型,但我猜现在也允许这样做。

查看此线程中的讨论


我想你会发现它让你朝着正确的方向前进。请特别注意关于是否需要使用其中一个参数作为一种手段来整理其他参数的内容和位置的讨论。

依赖于实现

预测试

long int addsquares(int n, int d1, ...){
    printf("%p,%p\n", &n, &d1);
    return 0L;
}
结果: windows 64位系统,vc10大小:4

003DFD54,003DFD58
000000000022FE60,000000000022FE68
windows 64位系统,gcc 4.4.3 sizeof int:4

003DFD54,003DFD58
000000000022FE60,000000000022FE68
对于vc10:

long int addsquares(int n, ...){
    int i, *p = &n;
    long sum = 0L;

    for(i=1;i<=n;++i)
        sum += p[i]*p[i];

    return sum;
}
对于gcc:

long int addsquares(int n, ...){
    int i, *p = &n;
    long sum = 0L;

    for(i=1;i<=n;++i)
        sum += p[i*2]*p[i*2];

    return sum;
}

addsquares的签名是固定的吗?为什么不能使用va_start或va_arg?例如,家庭作业问题就是这么说的,还是有技术限制?为什么不能使用va_start和va_arg?这正是他们的目的。你读过这个问题的答案吗?这是一个家庭作业限制…如果不使用va_*函数/宏,就不可能在符合标准的C中访问这些参数。有些东西必须去,要么是C,要么是省略号,要么是限制。我必须使用long int addsquaresintn,…正如家庭作业所说,我必须访问堆栈才能知道参数n的地址。。。我不知道如何…内联汇编语言是你的friend@PTF-如果您查看va_xxx宏的源代码,您会发现它非常依赖于系统,这取决于您的体系结构和编译器。至少,当进行函数调用时,参数被推送到堆栈上,如果您查看反汇编,您可以看到这一点。您的环境是什么?如何使用p[I]访问eatch参数?我不能以p[1]或p[2]为例…@PTF您试图运行预测试代码?并调用函数如addsquares3,1,2,3;需要查看系统上的预测试代码。之后这种方式并不完全是一种可移植的方式。堆栈帧可以预期。参数被称为按顺序排列,但取决于实现,如果知道以下参数的地址位置之间的差异,则可以预测以下位置的地址:可以获得第一个参数的地址。@PTF发生了什么事指针的结果输出运行预测试代码的地址?执行示例:,但这种方法可能在任何时候都不会奏效。