今天在调一段代码时,有下面的打印语句:
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:
阅读(1062) | 评论(1) | 转发(0) |