2014-07-10 11 views
7

मेमोसेट क्यों करें कोई निश्चित गाइड है जो कहता है कि हमें किसी विशेष कारण के लिए sockaddr_in संरचना को शून्य में प्रारंभ करना है?क्यों sockaddr_in को 0

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] सदस्य गद्दी के लिए नहीं है और:

// 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 
}; 

जब भी मैं वास्तविक कोड या उदाहरण या किताबों में देखा यह हमेशा कोड संरचना निम्न के समान है शून्य पर सेट किया जाना चाहिए, लेकिन बाकी को शून्य क्यों करना चाहिए। विशेष रूप से जब वे घोषणा के अगले कुछ पंक्तियों के भीतर ज्यादातर मामलों में शुरू होते हैं। Sin_zero सदस्य के बारे में भी beej प्रोग्रामिंग गाइड said it is not mandatory to zero them out anymore। मैंने एक स्पष्टीकरण की खोज की है लेकिन बिंदु के लिए कुछ भी नहीं हुआ है। यह stack overflow question में प्रारंभिकरण पर कुछ अलग-अलग सुझाव हैं लेकिन यह नहीं समझाता कि शून्यिंग आवश्यक क्यों है।

क्या यह एक विरासत अभ्यास है या कुछ वास्तविक कारण हैं जो मुझे याद आ रही है? किसी भी संदर्भ की सराहना की है।

+1

यह सुनिश्चित करता है कि आप कचरे के मूल्यों पर निर्भर कोड के साथ समाप्त नहीं होते हैं। इस तरह का कोड हेज़ेनबग और अन्य बग उत्पन्न कर सकता है जो डीबग करना मुश्किल होता है। –

+1

या सिर्फ 'struct sockaddr_in foo = {AF_INET, htons (1025)}; '- यह छोटा है, और शेष शेष सदस्यों को शून्य करता है। – MSalters

उत्तर

6

इसे डिफ़ॉल्ट कन्स्ट्रक्टर के रूप में सोचें, यानी यह डेटा ज्ञात मानों (0 इस मामले में 0) को प्रारंभ करता है। यह पीओडी का उपयोग करते समय गैर-प्रारंभिक डेटा से संबंधित मुद्दों को कम करने में मदद कर सकता है, जैसे सदस्य सेट करना भूलना, हालांकि memset वास्तव में आवश्यक नहीं है और आप केवल sockaddr_in foo{}; के साथ संरचना को मूल्य-प्रारंभ कर सकते हैं (संयोग से यह भी बेहतर असेंबली कोड में परिणाम देता है memset पर कॉल करने के बजाए संकलक के रूप में दृश्य movq 0 सबकुछ कर सकते हैं, यह नहीं कि 99% मामलों में इससे काफी अंतर आएगा)।

यदि आप पूरी तरह से सुनिश्चित हैं कि आप सभी सदस्यों को सेट करने जा रहे हैं तो यह कड़ाई से जरूरी नहीं है, हालांकि अगर आप कुछ प्रारंभ करना भूल जाते हैं तो इससे पहले कीड़े को पकड़ने में मदद मिल सकती है।

संबंधित मुद्दे