Chinaunix首页 | 论坛 | 博客
  • 博客访问: 333782
  • 博文数量: 56
  • 博客积分: 2058
  • 博客等级: 中尉
  • 技术积分: 688
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-11 09:19
个人简介

code rush

文章分类

全部博文(56)

文章存档

2012年(2)

2011年(54)

分类: LINUX

2011-06-15 02:08:07

崩溃,一个inet_ntoa()函数的自身特性害的我调试了半天程序。

inet_ntoa函数就是将IP无符号整形转换成IP字符串,函数返回的是指向IP字符串的一个指针,乍看没什么问题。门道就在返回的这个字符串上。这个字符串是在其内部静态分配的,后面的每次调用都会覆盖上一次的值。

因此,每次使用过后要备份数据,才能继续调用。

struct in_addr saddr,daddr;
saddr.s_addr=1.2.3.4;
daddr.s_addr=2.3.4.5;
printf("%s : %s\n", inet_ntoa(saddr), inet_ntoa(daddr));

则结果都是 1.2.3.4 printf 从右向左求值,daddr 先求的2.3.4.5被 1.2.3.4覆盖。用的同一块内存。

但是如果把printf 分为两行打印就没有问题了,分别求值,每段数据都可以重新赋值。




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

crazyhadoop2011-06-17 10:49:15

网络安全服务: 嘿嘿```好精神啊```.....

网络安全服务2011-06-16 15:10:30

嘿嘿```好精神啊```

crazyhadoop2011-06-15 19:38:44

GFree_Wind: 呵呵,自然是静态分配的。不然还得释放。。。.....
嗯,开始没有注意到这个问题,很是崩溃撒~~哈哈

GFree_Wind2011-06-15 12:15:38

呵呵,自然是静态分配的。不然还得释放。。。

crazyhadoop2011-06-15 11:47:31

网络安全服务: 这么早写文章啊`.....
是还没睡,顺手记录一下问题~~哈哈