无法使用可变参数实现函数
Couldn't implement function with variable arguments
我试图用可变参数实现函数,但得到的是垃圾值,因为 output.I 在尝试实现我的 own.Could 之前参考了这个 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;
}
问题是您尝试直接访问堆栈中您假定 找到参数的位置。调用约定是机器特定的,有时是编译器特定的,并且是您 永远不能依赖的实现细节 ,因此您的参数可能在您假设的堆栈中找不到。就 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;
}
我试图用可变参数实现函数,但得到的是垃圾值,因为 output.I 在尝试实现我的 own.Could 之前参考了这个 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;
}
问题是您尝试直接访问堆栈中您假定 找到参数的位置。调用约定是机器特定的,有时是编译器特定的,并且是您 永远不能依赖的实现细节 ,因此您的参数可能在您假设的堆栈中找不到。就 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;
}