2011-12-18 6 views
10

सामान्य तौर पर, सी मानक के अनुसार यह 0 के साथ कि memset() एक सी संरचना में गद्दी बिट्स को शून्य होगा इसकी गारंटी है?क्या यह गारंटी है कि मेमसेट संरचना में पैडिंग बिट्स को शून्य करेगा?

क्या जीसीसी के बारे में?

उदाहरण के लिए, कुछ की तरह:

struct MyStruct 
{ 
    unsigned char member1; 
    unsigned int member2; 
    char  member3; 
    unsigned char member4; 
    float  member5;  
}; 

struct MyStruct ms; 

memset(&ms, 0, sizeof(struct MyStruct)); 
+0

आप हमें एक कोड नमूना दिखा सकते हैं? – Mysticial

+0

जोड़ा गया कोड नमूना –

+2

मुझे समझ में नहीं आता कि आपका संदेह क्या है। –

उत्तर

15

शायद यह देखते हुए कि memset अपने struct (या सरणी, या आदिम, या के किसी भी हिस्से के बारे में कुछ भी पता नहीं है लायक स्मृति जो भी आप इसे खोलने के लिए होती है), इसलिए यदि वह पैडिंग बिट्स को बरकरार रखना चाहता है, तो यह भी नहीं पता कि वे कहां हैं।

11

हाँ, memset एक 32 बिट मूल्य दिए गए पते पर शुरू होने वाले एक दिया लंबाई की स्मृति का एक सन्निहित क्षेत्र में लिखता है। आपके मामले में, मेमसेट क्षेत्र (32 बिट मान) 0 के साथ क्षेत्र लिखता है।

तो अगर आप लंबाई sizeof (your_struct) के memset करते हैं, आप ठीक होना चाहिए:

memset(&ms, 0, sizeof(struct MyStruct)); 
8

अगर यह मायने रखती है, आप की संभावना कुछ असुरक्षित और गैर पोर्टेबल कर रहे हैं।

हाँ, memset कॉल 0 के लिए किसी भी गद्दी बिट्स (या बाइट्स) स्थापित करेगा - लेकिन भाषा है कि सभी बिट शून्य करने के लिए एक float वस्तु की स्थापना 0.0 करने के लिए यह कर देगा में कोई गारंटी नहीं है। वही पॉइंटर्स पर लागू होता है: ऑल-बिट्स-शून्य को शून्य सूचक होने की गारंटी नहीं है। (दोनों मामलों में, यह अधिकांश कार्यान्वयन के लिए सच होता है।)

मूल आईएसओ सी 9 0 या सी 99 मानक ने यह भी गारंटी नहीं दी कि सभी बिट्स-शून्य पूर्णांक प्रकारों के लिए 0 का मान्य प्रतिनिधित्व है; सी -99 तकनीकी कोर्रिजेंडा में से एक ने ऐसी गारंटी दी (केवल पूर्णांक प्रकारों के लिए)।

पोर्टेबिलिटी के लिए, यदि आप कुछ शून्य होना चाहते हैं, यह स्पष्ट रूप से सेट। आप स्थैतिक वस्तुओं के लिए शून्य प्रारंभिकरण और शुरुआती सदस्यों में छोड़े गए सदस्यों के लिए लाभ भी ले सकते हैं।

एक पारिभाषिक nitpick: "पैडिंग बिट्स" पूर्णांक प्रकार के प्रतिनिधित्व का हिस्सा हैं (और आमतौर पर वहाँ उनमें से कोई भी कर रहे हैं)। स्ट्रक्चर सदस्यों के बीच पैडिंग बाइट पैडिंग है।

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