簡體   English   中英

為什么 inet_ntoa 中的緩沖區大小是 18?

[英]Why is the buffer size in inet_ntoa 18?

我看着的實現inet_ntoa這個這個

我想知道為什么他們都分配了一個 18 個字符的緩沖區。

如果我采用最大長度的 IPv4 地址字符串: 255.255.255.255 ,我需要的大小是:每個八位字節為 3,點為 3,空終止符為 1。 3*4+3+1 = 16。

那么為什么我們需要那 2 個額外的字符呢?

第一個鏈接中的inet_ntoa實現:

static __thread char buffer[18];

char *
inet_ntoa (struct in_addr in)
{
  unsigned char *bytes = (unsigned char *) ∈
  __snprintf (buffer, sizeof (buffer), "%d.%d.%d.%d",
              bytes[0], bytes[1], bytes[2], bytes[3]);
  return buffer;
}

如果我采用最大長度的 IPv4 地址字符串:255.255.255.255,我需要的大小是:每個八位字節為 3,點為 3,空終止符為 1。 3*4+3+1 = 16。

那么為什么我們需要那 2 個額外的字符呢?

你的計算是正確的。 僅需要 16 個字節來存儲由inet_ntoa()生成的點分十進制地址字符串,包括其終止符。 相關文檔和規范至少早在 POSIX.1 2004 就指定了當前格式,據我所知,還沒有發布產生任何其他格式的實現,因此我們只能推測為什么某些實現提供額外的空間。 可能性包括但不限於

  • 打字錯誤或計算錯誤;
  • 緩沖區被(可能仍然)用於不止一件事,而其他用途需要更多字節;
  • 某些實現用於格式化結果的算法得益於有幾個額外的字節可以使用;
  • 為 slop 空間提供了額外的字節,以減輕假設錯誤的影響。

今天在許多實現中觀察到相同的額外字節可能支持多用途緩沖區替代方案,但該觀察結果也與在某些早期實現中出現的那些字節的任何解釋一致,也許 BSD,並從那里傳播到許多后續的. 我傾向於支持后一種解釋。

暫無
暫無

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

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