例: 当调用函数add_values(10,20,30,0)时,调用的堆栈为:
-------------
10
-------------
20
-------------
30
-------------
0
-------------
函数返回地址
-------------
可以通过宏va_list、va_start、 va_arg、 va_end 来从堆栈中读出数据。
原理比较简单、就是指针++。
函数
int add(int value,...)
{
va_list ptr;
int result=0;
result +=value;
va_start(ptr,value);
while((value = va_arg(ptr,int))!=0)
{
result += value;
}
va_end(ptr);
return result;
}
void main (void)
{
printf("%d",add(1,2,3,0));
}
最后的0,是用来指示已经到达末尾,不要再读了;(此函数设计不好,假如我用add(1,2,0,3,0)就只加前面两个,这里只是一个例子)。
printf() 也是采用更好的方式,它前面有 "字符串" 指示要读取多少个,所以不用一个特别的结束符号。
注:由于实现比较原始,所以容易出错,例如,在0之后指针再++,就会跑到返回地址。