簡體   English   中英

為什么將sockaddr_in設置為0

[英]Why memset sockaddr_in to 0

是否有任何權威指南說,由於特定原因,我們必須將sockaddr_in結構初始化為零?

// IPv4 AF_INET sockets:
struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET, AF_INET6
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
    char             sin_zero[8];  // zero this if you want to
};

每當我查看真實的代碼或示例或書籍時,它始終具有類似於以下內容的代碼結構:

struct sockaddr_in foo;
memset(&foo, 0, sizeof(foo)); 
foo.sin_port = htons(1025);
foo.sin_family = AF_INET;
inet_pton(AF_INET, "10.0.0.1", &foo.sin_addr);

我知道有些消息說char sin_zero[8]成員可以在那里填充,應該將其設置為零,但是為什么要將其余的零。 特別是在大多數情況下,在聲明的后幾行中初始化它們時。 甚至對於sin_zero成員,beej編程指南也表示不再強制將它們歸零 我一直在尋找解釋,但沒有提出要點。 這個堆棧溢出問題對初始化本身有一些不同的建議,但是沒有解釋為什么需要歸零。

這是一種傳統做法還是我錯過了某些真實原因? 任何參考表示贊賞。

將其視為默認構造函數,即它將數據初始化為已知值(在這種情況下為0)。 這可以幫助減輕使用POD時與未初始化數據相關的問題,例如忘記設置成員,盡管memset並不是真正必要的,並且您可以使用sockaddr_in foo{};值對結構進行初始化sockaddr_in foo{}; (順便說一句,這也可以在幕后產生更好的匯編代碼,因為編譯器可以移動所有內容而不是調用memset movq 0而不是在99%的情況下有很大的不同)。

如果您完全確定要設置所有成員,那么這不是嚴格必要的,盡管如果您忘記初始化某些內容,它可以幫助更早地捕獲錯誤。

暫無
暫無

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

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