1. 程式人生 > >inet_ntoa()多次呼叫時的問題

inet_ntoa()多次呼叫時的問題

崩潰,一個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 分為兩行列印就沒有問題了,分別求值,每段資料都可以重新賦值。