可变函数使用问题

ychongx 2014-05-27 07:58:03
各位高手解释下,程序为啥出现警告,且注释行打印的结果不对
ubuntu版本为:ubuntu9.10
gcc版本为:gcc version 4.4.1
程序功能:1/2+1/(2*2)+1/(2*2*2)+1/(2*2*2*2)
代码:

#include<stdio.h>
#include<stdarg.h>

double sum_series(int num, ...)
{
double sum=0.0, t;
va_list argptr;
va_start(argptr, num);
for( ; num; num--)
{
printf("argptr = %p, *argptr = %10.9f\n", argptr, *argptr);
t = va_arg(argptr, double);
sum +=t;
}
va_end(argptr);
return sum;
}

int main()
{
double d;
d = sum_series(4, 0.5, 0.25, 0.125, 0.06254);
printf("sum of series is %f\n", d);
return 0;

}



root@book-desktop:/work/video_example# cc doublesum.c
doublesum.c: In function ‘sum_series’:
doublesum.c:11: warning: format ‘%10.9f’ expects type ‘double’, but argument 3 has type ‘int’
root@book-desktop:/work/video_example# ./a.out
argptr = 0xbfa0ef64, *argptr = 0.000000000
argptr = 0xbfa0ef6c, *argptr = 0.000000000
argptr = 0xbfa0ef74, *argptr = 0.000000000
argptr = 0xbfa0ef7c, *argptr = 0.000000000
sum of series is 0.937540
为什么出现警告?*argptr列的结果为啥不是0.5/0.25/0.125/0.06254呢?
...全文
87 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ychongx 2014-05-27
  • 打赏
  • 举报
回复
引用 2 楼 ychongx 的回复:
[quote=引用 1 楼 ForestDB 的回复:] %f需要一个double,但是*argptr并不是double t = va_arg(argptr, double); printf("argptr = %p, *argptr = %10.9f\n", argptr, t); 这样试试?
想直观的看0.5, 0.25, 0.125, 0.06254在栈中的分布, va_start(argptr, num)执行后argptr指针指向0.5, va_arg(argptr, double)执行的话,先在&0.5地址处按8字节(double)取0.5给t,然后argptr+1即&0.5地址 0xbfa0ef64+0x8,这样解释对不             printf("argptr = %p, *argptr = %10.9f\n", argptr, (double *)argptr);//这里将argptr强制转换为 double指针             t = va_arg(argptr, double); 运行结果还是如此:

root@book-desktop:/work/video_example# cc doublesum.c 
doublesum.c: In function ‘sum_series’:
doublesum.c:12: warning: format ‘%10.9f’ expects type ‘double’, but argument 3 has type ‘double *’
root@book-desktop:/work/video_example# ./a.out 
argptr = 0xbfef7ac4, *argptr = 0.000000000
argptr = 0xbfef7acc, *argptr = 0.000000000
argptr = 0xbfef7ad4, *argptr = 0.000000000
argptr = 0xbfef7adc, *argptr = 0.000000000
sum of series is 0.937540

[/quote] 可以改为: printf("argptr = %p, *argptr = %10.9f\n", argptr, *((double *)argptr)); t = va_arg(argptr, double); 这样就对了
ForestDB 2014-05-27
  • 打赏
  • 举报
回复
printf("argptr = %p, *argptr = %10.9f\n", argptr, *((double *)argptr));
ychongx 2014-05-27
  • 打赏
  • 举报
回复
引用 1 楼 ForestDB 的回复:
%f需要一个double,但是*argptr并不是double t = va_arg(argptr, double); printf("argptr = %p, *argptr = %10.9f\n", argptr, t); 这样试试?
想直观的看0.5, 0.25, 0.125, 0.06254在栈中的分布, va_start(argptr, num)执行后argptr指针指向0.5, va_arg(argptr, double)执行的话,先在&0.5地址处按8字节(double)取0.5给t,然后argptr+1即&0.5地址 0xbfa0ef64+0x8,这样解释对不             printf("argptr = %p, *argptr = %10.9f\n", argptr, (double *)argptr);//这里将argptr强制转换为 double指针             t = va_arg(argptr, double); 运行结果还是如此:

root@book-desktop:/work/video_example# cc doublesum.c 
doublesum.c: In function ‘sum_series’:
doublesum.c:12: warning: format ‘%10.9f’ expects type ‘double’, but argument 3 has type ‘double *’
root@book-desktop:/work/video_example# ./a.out 
argptr = 0xbfef7ac4, *argptr = 0.000000000
argptr = 0xbfef7acc, *argptr = 0.000000000
argptr = 0xbfef7ad4, *argptr = 0.000000000
argptr = 0xbfef7adc, *argptr = 0.000000000
sum of series is 0.937540

ForestDB 2014-05-27
  • 打赏
  • 举报
回复
%f需要一个double,但是*argptr并不是double t = va_arg(argptr, double); printf("argptr = %p, *argptr = %10.9f\n", argptr, t); 这样试试?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧