[英]Why inet_ntoa called twice in printf gives wrong output?
我寫了一個代碼,但我不確定為什么最后一個printf會產生意想不到的結果。 我的命令行參數是12和15.代碼如下:
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
struct in_addr adr, adr2;
int num, num2;
num = atoi(argv[1]);
num2 = atoi(argv[2]);
adr.s_addr = htonl(num);
adr2.s_addr = htonl(num2);
printf("%x %x\n", num, adr.s_addr); # c c000000
printf("%x %x\n", num2, adr2.s_addr); # f f000000
printf("%s\n", inet_ntoa(adr)); # 0.0.0.12
printf("%s\n", inet_ntoa(adr2)); # 0.0.0.15
printf("%s %s\n", inet_ntoa(adr), inet_ntoa(adr2)); # 0.0.0.12 0.0.0.12
return(0);
}
我預計最終輸出為“0.0.0.12 0.0.0.15”,但事實並非如此。 有人可以幫忙嗎?
inet_ntoa
函數返回指向靜態緩沖區的指針。 在這種情況下,該函數被調用兩次作為另一個函數的參數。 函數參數的評估順序是未指定的,因此靜態緩沖區的內容將是最后運行的那個。 並且因為它總是返回相同的緩沖區,所以同樣的東西將打印兩次。
因此,如果沒有中間序列點,即無法調用這樣的函數,即單獨的語句,短路運算符(如&&
或||
,逗號運算符或三元運算符。
在這個特定代碼的情況下,兩次單獨調用printf
每次調用inet_ntoa
(正如你在前兩行中所做的那樣)是正確的方法。
此外,如果您計划在某個地方保存此函數的結果,則不能只保存指針,因為每次調用inet_ntoa
它指向的數據都會更改。 您需要使用strcpy
或strdup
復制它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.