将可变长度参数列表传递给另一个函数
Passing variable length argument list to another function
我已经制作了一个单独的函数 display() 来显示数字,并希望发送初始化的
指向此 function.I 的参数指针未获得预期结果。这里出了什么问题?
我正在使用 gcc 版本 10.1.0 (GCC)
/* Expected OUTPUT */
99 + 68 -> Total = 167
11 + 79 + 32-> Total = 122
23 + 34 + 45 + 56 + 78 -> Total = 236
/* Getting OUTPUT */
99 + 68 -> Total = 224
11 + 79 + 32 -> Total = 1410200528
23 + 34 + 45 + 56 + 78 -> Total = -1056735662
我的代码是:
/* Program in which the variable length list is passed to another function */
#include<stdio.h>
#include<stdarg.h>
int sum(int, ...);
void display(int,va_list);
int main(void)
{
printf("\b\b-> Total = %d\n",sum(2,99,68));
printf("\b\b-> Total = %d\n",sum(3,11,79,32));
printf("\b\b-> Total = %d\n",sum(5,23,34,45,56,78));
return 0;
}
int sum(int num, ...)
{
int i;
va_list ap;
int arg,total = 0;
va_start(ap,num);
display(num,ap);
for(i=0; i<num; i++)
{
arg=va_arg(ap,int);
total+=arg;
}
va_end(ap);
return total;
}
void display(int num,va_list ap)
{
int i,argument;
for(i=0; i<num; i++)
{
argument=va_arg(ap,int);
printf("%d + ",argument);
}
}
规则从 C11 7.16p3 开始严格:
The object ap
[of type va_list
] may be passed as an argument to another function; if that function invokes the va_arg macro with parameter ap, the value of ap in the calling function is indeterminate and shall be passed to the va_end
macro prior to any further reference to ap.
代码:
display(num,ap);
va_arg(ap, ...);
无效 - 一旦将 va_list
传递给另一个函数,您可以 仅 调用 va_end
。您可以指向 va_list
.
{
...
display(num, &ap);
va_arg(ap, int); // ok
va_end(ap);
}
void display(int num, va_list *ap) {
va_arg(*ap, int); // ok
}
但您正在迭代 va_list
两次 - 一次在显示中,一次在 sum
中。 va_list
记住它的位置,所以要迭代列表两次你必须从一开始就初始化两个 va_list
。在您的情况下,最简单的方法是初始化 va_list
两次。所以你可以这样做:
int sum(int num, ...) {
va_list ap;
va_start(ap, num);
display(num, ap);
va_end(ap);
int total = 0;
va_start(ap, num);
for (int i = 0; i < num; i++) {
int arg = va_arg(ap, int);
total += arg;
}
va_end(ap);
return total;
}
void display(int num, va_list ap)
{
for(int i = 0; i < num; i++)
{
int argument = va_arg(ap,int);
printf("%d + ",argument);
}
}
我已经制作了一个单独的函数 display() 来显示数字,并希望发送初始化的 指向此 function.I 的参数指针未获得预期结果。这里出了什么问题? 我正在使用 gcc 版本 10.1.0 (GCC)
/* Expected OUTPUT */
99 + 68 -> Total = 167
11 + 79 + 32-> Total = 122
23 + 34 + 45 + 56 + 78 -> Total = 236
/* Getting OUTPUT */
99 + 68 -> Total = 224
11 + 79 + 32 -> Total = 1410200528
23 + 34 + 45 + 56 + 78 -> Total = -1056735662
我的代码是:
/* Program in which the variable length list is passed to another function */
#include<stdio.h>
#include<stdarg.h>
int sum(int, ...);
void display(int,va_list);
int main(void)
{
printf("\b\b-> Total = %d\n",sum(2,99,68));
printf("\b\b-> Total = %d\n",sum(3,11,79,32));
printf("\b\b-> Total = %d\n",sum(5,23,34,45,56,78));
return 0;
}
int sum(int num, ...)
{
int i;
va_list ap;
int arg,total = 0;
va_start(ap,num);
display(num,ap);
for(i=0; i<num; i++)
{
arg=va_arg(ap,int);
total+=arg;
}
va_end(ap);
return total;
}
void display(int num,va_list ap)
{
int i,argument;
for(i=0; i<num; i++)
{
argument=va_arg(ap,int);
printf("%d + ",argument);
}
}
规则从 C11 7.16p3 开始严格:
The object
ap
[of typeva_list
] may be passed as an argument to another function; if that function invokes the va_arg macro with parameter ap, the value of ap in the calling function is indeterminate and shall be passed to theva_end
macro prior to any further reference to ap.
代码:
display(num,ap);
va_arg(ap, ...);
无效 - 一旦将 va_list
传递给另一个函数,您可以 仅 调用 va_end
。您可以指向 va_list
.
{
...
display(num, &ap);
va_arg(ap, int); // ok
va_end(ap);
}
void display(int num, va_list *ap) {
va_arg(*ap, int); // ok
}
但您正在迭代 va_list
两次 - 一次在显示中,一次在 sum
中。 va_list
记住它的位置,所以要迭代列表两次你必须从一开始就初始化两个 va_list
。在您的情况下,最简单的方法是初始化 va_list
两次。所以你可以这样做:
int sum(int num, ...) {
va_list ap;
va_start(ap, num);
display(num, ap);
va_end(ap);
int total = 0;
va_start(ap, num);
for (int i = 0; i < num; i++) {
int arg = va_arg(ap, int);
total += arg;
}
va_end(ap);
return total;
}
void display(int num, va_list ap)
{
for(int i = 0; i < num; i++)
{
int argument = va_arg(ap,int);
printf("%d + ",argument);
}
}