我试图用变量参数实现函数但是将垃圾值作为输出。我在尝试自己实现之前已经引用了这个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;
}
答案 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;
}