Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1788943
  • 博文数量: 335
  • 博客积分: 4690
  • 博客等级: 上校
  • 技术积分: 4341
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-08 21:38
个人简介

无聊之人--除了技术,还是技术,你懂得

文章分类

全部博文(335)

文章存档

2016年(29)

2015年(18)

2014年(7)

2013年(86)

2012年(90)

2011年(105)

分类: C/C++

2011-10-08 18:38:19

  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <iostream>
  5. #include <stdarg.h>
  6. #define OK 0
  7. using namespace std;
  8. void minprintf(char *,...);
  9. int main(){
  10. cout<<"可变长度参数列表的简单实现"<<endl;
  11. int i = 5;
  12. char ch = 'c';
  13. char *s = "test";
  14. double dou=1.005;
  15. minprintf("%dx%sx%cxxxx%f",i,s,ch,dou);
  16. getchar();
  17. return OK;
  18. }
  19. void minprintf(char * fmt,...){
  20. va_list ap;
  21. char *p=NULL,*sval=NULL;
  22. int ival=0;
  23. double dval=0.0;
  24. char cval='d';
  25. va_start(ap,fmt);
  26. for(p = fmt;*p; p++){
  27. if(*p != '%'){
  28. putchar(*p);
  29. continue;
  30. }
  31. p++;
  32. switch (*p){
  33. case 'd':
  34. ival=va_arg(ap,int);
  35. printf("%d",ival);
  36. break;
  37. case 'f':
  38. dval=va_arg(ap,double);
  39. printf("%6.3f",dval);
  40. break;
  41. case 's':
  42. sval=va_arg(ap,char *);
  43. for(;*sval;sval++){
  44. putchar(*sval);
  45. }
  46. break;
  47. case 'c':
  48. cval=(char)va_arg(ap,int);
  49. putchar(cval);
  50. break;
  51. default :
  52. putchar(*p);
  53. break;
  54. }
  55. }
  56. va_end(ap);
  57. }
偶然看到k&r中有个可变长度参数列表的程序,自己跑了一下,不跑不知道,一跑下一跳啊,在书中
作者对va_arg 中第二个参数为数据类型做了测试,其中包括,%d,%f,%s ,偶略做扩展,增加了一个格式控制%c,然后问题就悄然出现了,竟然提示非法指令,地址访问越界,
cval=va_arg(ap,char);

调试的时候,到这一条程序语句程序就出问题,偶无奈之下,只好百度,然后在gcc-bug 看到这样一段:

这样,char short 就会默认提升为int,这样程序就出现非法指令,。。。。。解决办法是
cval=(char)va_arg(ap,int); 
偶然发现,呵呵,

阅读(1356) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~