1

这是我的代码:

#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指向错误的地址吗?如何正确读取传递为的参数...

4

2 回答 2

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

于 2012-06-04T08:00:18.883 回答
2

您的特定示例可能有效,也可能无效(在我的系统上按您预期的方式工作)。您p=&num+1;可以访问下一个元素。在堆栈上升的假设下,这很好,而您的架构可能并非如此。在许多系统上,达到一定限制的变量是在寄存器上传递而不是在堆栈上传递!所以你的假设完全错误。另请注意,变量可以从左到右或以其他方式推入堆栈。它没有被标准指定。

因此,您不应根据假设工作,而应使用专为此特定用途设计的函数。

于 2012-06-04T08:06:52.100 回答