inet_ntoa()多次调用时的问题

来源:互联网 发布:查找重复删除知乎 编辑:程序博客网 时间:2024/05/24 04:54

本文转自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 分为两行打印就没有问题了,分别求值,每段数据都可以重新赋值。

0 0