0

我正在编写一个简单的可变参数函数,它将一系列整数相加并返回总和。我在理解它的工作原理时遇到了一些麻烦,尽管我觉得我的代码方向正确,但我的代码似乎不起作用。(贴在下面)这个函数的规范是它至少需要一个参数,最后一个参数总是为零(如在 main 中调用的那样)。我还被告知,根据我的机器,我不一定会得到我正在寻找的输出,正如你所想象的那样,这会使我的情况进一步复杂化。非常感谢您对纠正我的 Sum() 函数的帮助。

编辑:这应该在不使用 stdarg.h 标头的情况下完成,因此没有 va_arg 函数。

int Sum(int a, ... ) {
   int sum = 0, *addy = &a;

   while (*addy) {
      sum += *addy;
      addy += sizeof(a);
   }

   return sum;
}


int main() {
   printf("%d %d %d %d\n", Sum(0), Sum(3, 5, 6, 7, 0),
   Sum(7, 2, 42, 3, 5, -4, 0), Sum(-1, 9, 12, 123, -213, 42, 7, 2, 0));
}
//Expected output: 0 21 55 -19
//My output: 0 32770 32770 32776
4

4 回答 4

3

当您将数字添加到 int 指针(如 中addy += sizeof(a))时,您添加的数字会自动乘以指针声明为的任何类型的大小(在本例中int)。要解决此问题,只需使用

addy += 1;

反而。但是,我建议使用可变参数宏而不是这种方法,它们更清晰且不易出错。

于 2013-01-22T05:04:01.627 回答
1

对于可变参数,你必须使用va_startva_end函数,希望有用..

http://www.gnu.org/software/libc/manual/html_node/Variadic-Example.html#Variadic-Example

于 2013-01-22T05:04:45.173 回答
1

你能检查一下吗

int Sum(int a, ... ) {
 int sum = 0, *addy = &a;

while (*addy) {
  sum += *addy;
  addy ++;
}

return sum;
}


int main() {
   printf("%d %d %d %d\n", Sum(0), Sum(3, 5, 6, 7, 0),
  Sum(7, 2, 42, 3, 5, -4, 0), Sum(-1, 9, 12, 123, -213, 42, 7, 2, 0));
}

要记住的是指针操作:您添加到指针的数字将乘以指针指向的类型的大小。所以增加指针 addy 就足以获取下一个元素。

于 2013-01-22T05:08:43.440 回答
0
 #include <stdarg.h>
 #include <stdio.h>

 int
 add_em_up (int count,...)
 {
   va_list ap;
   int i, sum;

   va_start (ap, count);         /* Initialize the argument list. */

   sum = 0;
   for (i = 0; i < count; i++)
     sum += va_arg (ap, int);    /* Get the next argument value. */

   va_end (ap);                  /* Clean up. */
   return sum;
 }

 int
 main (void)
 {
   /* This call prints 16. */
   printf ("%d\n", add_em_up (3, 5, 5, 6));

   /* This call prints 55. */
   printf ("%d\n", add_em_up (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));

   return 0;
 }
于 2014-08-07T15:17:18.943 回答