[英]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.