无法使用变量参数实现函数

时间:2017-06-16 09:34:27

标签: c function arguments parameter-passing variadic-functions

我试图用变量参数实现函数但是将垃圾值作为输出。我在尝试自己实现之前已经引用了这个article。可以任何人帮我解决这个代码,因为我无法了解此代码中的错误。

/* va_arg example */
#include <stdio.h>      /* printf */
int FindMax (int n, ...)
{
    int i,val,largest,*p;
    p=&n;
    p+=sizeof(int);
    largest=*p;
    for (i=1;i<n-2;i++)
    {
        p+=sizeof(int);
        val=*p;
        largest=(largest>val)?largest:val;
    }
    return largest;
}
int main ()
{
    int m;
    m= FindMax (7,702,422,631,834,892,104,772);
    printf ("The largest value is: %d\n",m);
    return 0;
}

1 个答案:

答案 0 :(得分:3)

问题是您尝试直接访问堆栈中的位置假设以查找您的参数。调用约定是机器的,有时是特定于编译器的,并且永远不能依赖的实现细节,因此可能在您认为它们所在的堆栈中找不到您的参数。就C而言,您的代码只会调用未定义的行为

解决方案:使用stdarg.h来访问参数,以及它的用途。

#include <stdio.h>      /* printf */
#include <stdarg.h>

int FindMax (int n, ...)
{
    va_list ap;
    int i,val,largest;

    va_start(ap, n); // <- ap is the argument pointer, this initializes it
                     //    based on the last non-variadic argument.

    largest=0;
    while (n--)
    {
        val = va_arg(ap, int); // <- fetch argument and advance pointer
        largest=(largest>val)?largest:val;
    }
    va_end(ap); // done with argument pointer

    return largest;
}
int main ()
{
    int m;
    m= FindMax (7,702,422,631,834,892,104,772);
    printf ("The largest value is: %d\n",m);
    return 0;
}