簡體   English   中英

當使用兩個不同的地址調用時,inet_ntoa會給出相同的結果

[英]inet_ntoa gives the same result when called with two different addresses

//
char ip1[] = "127.0.0.1";
char ip2[] = "211.100.21.179";
printf("ip1: %s\nip2: %s\n", ip1, ip2);

// 
long l1 = inet_addr(ip1);
long l2 = inet_addr(ip2);
printf("ip1: %ld\nip2: %ld\n", l1, l2);

//
struct in_addr addr1, addr2;
memcpy(&addr1, &l1, 4);
memcpy(&addr2, &l2, 4);
printf("%u\n", addr1.s_addr);
printf("%u\n", addr2.s_addr);

//
printf("%s\n", inet_ntoa(addr1));
printf("%s\n", inet_ntoa(addr2));

//
printf("%u,%s\n", addr1.s_addr, inet_ntoa(addr1));
printf("%u,%s\n", addr2.s_addr, inet_ntoa(addr2));
printf("%s <--> %s\n", inet_ntoa(addr1), inet_ntoa(addr2));

輸出是:

ip1: 127.0.0.1
ip2: 211.100.21.179
ip1: 16777343
ip2: 3004523731
16777343
3004523731
127.0.0.1
211.100.21.179
16777343,127.0.0.1
3004523731,211.100.21.179
211.100.21.179 <--> 211.100.21.179    // why the same??

我知道printf parse arg從右到左或反之亦然是平台相關的,但為什么輸出是相同的值,請幫忙解釋一下。

從Linux手冊頁: https//linux.die.net/man/3/inet_ntoa

inet_ntoa()函數將以網絡字節順序給出的Internet主機地址轉換為IPv4點分十進制表示法中的字符串。 該字符串在靜態分配的緩沖區中返回,后續調用將覆蓋該緩沖區。

似乎兩個調用inet_nota()共享一個緩沖區,因此調用該函數兩次會覆蓋緩沖區中的什么並將其替換為下一個調用,從而獲得相同的輸出

inet_ntoa()使用內部緩沖區將地址轉換為字符串。 每次調用它時,它都會用新地址重寫相同的緩沖區。 因此,對inet_ntoa()兩次調用都返回相同的指針,因此printf()打印兩次相同的字符串。 inet_ntoa()執行此操作,以便每次調用時都不必free()字符串。 如果您希望輸出看起來像您期望的那樣,您可以這樣做:

 printf("%s <--> ", inet_ntoa(addr1))
 printf("%s\n", inet_ntoa(addr2));

這樣printf()將在第二次調用inet_ntoa()之前打印第一個地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM