簡體   English   中英

為什么inet_ntoa在printf中調用兩次會產生錯誤的輸出?

[英]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它指向的數據都會更改。 您需要使用strcpystrdup復制它。

暫無
暫無

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

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