Chinaunix首页 | 论坛 | 博客
  • 博客访问: 438742
  • 博文数量: 132
  • 博客积分: 2511
  • 博客等级: 大尉
  • 技术积分: 1385
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-11 15:10
文章分类

全部博文(132)

文章存档

2012年(18)

2011年(35)

2010年(60)

2009年(19)

分类: LINUX

2010-08-08 16:36:53

今天在调一段代码时,有下面的打印语句:


printf("Got ip pcacket,srcip:%s,dstip:%s,ip-id:%d,ttl:%d\n",inet_ntoa(ip->saddr),inet_ntoa(ip->daddr),ntohs(ip->id),ip->ttl);


inet_ntoa(ip->saddr),inet_ntoa(ip->daddr)是分别打印这个包的源IP及目的IP,不过奇怪的是,每次打印出来的都是源IP的地址,后来查了一下资料,发觉是inet_ntoa的问题。
inet_ntoa的实现中使用了一块static的内存,用于保证该内存不需要调用者释放,同时对调用者又是可见的,但这样造成的问题是,后来的inet_ntoa()调用会覆盖之前的结果。。
所以,在上面的代码中,printf在获取参数时,从右向左(这一点从执行结果看得出来)计算参数的值,执行传进来的函数,先执inet_ntoa(ip->daddr),再执行inet_ntoa(ip->saddr),结果printf中的两个参数指向了同一块内存,而且第二个调用的结果覆盖了第一个调用的结果,因此打印出来的内容是一样的,并且是第二次调用后的结果。



------------
参考URL:

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

bedreaming2011-05-11 15:35:55

挖出来,因为今天又碰到这个问题了。。