如何读取可变参数函数参数?

时间:2012-06-04 07:58:44

标签: c pointers variadic-functions

这是我的代码:

#include <stdio.h>

void add(int num, ...);

int main(void)
{
  int a=100, b=200, c=300;

  add(1, a);
  add(2, a, b);
  add(3, a, b, c);
  return 0;
}

void add(int num, ...)
{
  int *p=NULL;
  p=&num+1;
  printf("%x \n", p);
  if(num==1)
    {
      printf("%d \n", p[0]);
      printf("num is: %d \n", num);
    }
  else if (num==2)
    {
      printf("%d \n", p[0]+p[1]);
      printf("num is: %d \n", num);
    }
  else
    {
      printf("%d \n", p[0]+p[1]+p[2]);
      printf("num is: %d \n", num);
    }
}

根据我的理解,p最初指向a,即10。因此,它应分别打印10,30,60。尽管如此,它打印

6786db50 
1736891264 
num is: 1 
6786db50 
1736924031 
num is: 2 
6786db50 
1867401241 
num is: 3 

p是否指向错误的地址?如何正确读取作为...传递的参数?

2 个答案:

答案 0 :(得分:4)

这不是你如何使用可变参数函数调用,你需要使用va_*函数调用来提取参数。

请参阅http://unixhelp.ed.ac.uk/CGI/man-cgi?stdarg+3http://en.wikipedia.org/wiki/Variadic_function#Variadic_functions_in_C.2C_Objective-C.2C_C.2B.2B.2C_and_D

答案 1 :(得分:2)

您的特定示例 可能会或可能不会 (按照您在我的系统上的预期工作)。您p=&num+1;可以访问下一个元素。这在堆栈升序的假设下很好,而您的架构可能不是这种情况。在许多系统上,变量达到某种限制,在寄存器上传递而不是在堆栈上传递!所以你的假设完全出错了。另请注意,变量可以从左到右或另一种方式推送到堆栈。标准未指明。

因此 您不应该使用假设 ,而是使用专为此特定用途设计的functions