2014-10-08 48 views
2

我現在這樣做的權利,但這是一個初始化struct sockaddr_in.sin_zero [8]爲0的正確方法嗎?

struct sockaddr_in my_addr; 
my_addr.sin_family = AF_INET; 
my_addr.sin_port = htons(MYPORT); 
inet_aton("10.12.110.57", &(my_addr.sin_addr)); 
memset(&(my_addr.sin_zero), '\0', 8); 

我能做到這一點?這是否也將零結構的其餘部分?即sin_zero[8]

struct sockaddr_in my_addr = {AF_INET, htons(MYPORT), 0}; 
// Or 
struct sockaddr_in my_addr = {AF_INET, htons(MYPORT), {0} }; 
+0

兩者都有效。正如Matt McNabb在他的回答中所提到的那樣,在第二種情況下指定的初始化器將使代碼更具可讀性。 – 2014-10-08 11:43:08

回答

4

是的,它是正確的。當然,你可以寫0,它比'\0'的冗長。你也可以用sizeof my_addr.sin_zero代替8,以確保你設置的字節數是正確的。

一個整潔的方式是:

struct sockaddr_in my_addr = { 0 }; 
my_addr.sin_family = AF_INET; 
my_addr.sin_port = htons(MYPORT); 

如果你想使用括號內的初始化整個事情,那麼我建議使用指定初始化的可讀性。此外,這可能也可能不可能,因爲在某些情況下,支撐初始值設定項必須是常量表達式,MYPORT是否爲變量還不清楚。

+0

@MattMcNabb我刪除了該評論我修復了問題中的代碼。 所以我的三種方法都是正確的? – pizzaEatingGuy 2014-10-08 11:40:40

+0

@pizzaEatingGuy是的,儘管你應該使用更強大,更容易看到的更正確的方式(也就是說,檢查你的代碼的人不需要查看文檔來查看你是否在memset中獲得了正確數量的字節,支撐初始化器的正確順序) – 2014-10-08 11:43:16

1

以最簡單的辦法值初始化在C++ 11是一個結構簡單的添加一個大括號或相等的初始化,讓aggregate initialization做的工作:

sockaddr_in my_addr {}; 

在C++ 03:

sockaddr_in my_addr = {}; 

順便說一句,sin_zero已根據Open Group Base Resolution bwg2001-004刪除。根據您的平臺,您可能不再需要關心該成員變量。