这是我的代码:
#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
是否指向错误的地址?如何正确读取作为...
传递的参数?
答案 0 :(得分:4)
这不是你如何使用可变参数函数调用,你需要使用va_*
函数调用来提取参数。
请参阅http://unixhelp.ed.ac.uk/CGI/man-cgi?stdarg+3或http://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。