本文转自http://blog.chinaunix.net/uid-25203957-id-372797.html,作者:crazyhadoop
崩溃,一个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 : 1.2.3.4" —— printf 从右向左求值,daddr 先求的2.3.4.5被 1.2.3.4覆盖。用的同一块内存。
但是如果把printf 分为两行打印就没有问题了,分别求值,每段数据都可以重新赋值。