यदि कोई सी कंपाइलर फ़ील्ड को अपने मूल संरेखण में संरेखित करने के लिए एक संरचना को पैड करता है, और तब उस संरचना को प्रारंभ किया जाता है, तो क्या पैडिंग शून्य पर शुरू होती है?क्या सी संरचना पैडिंग को शून्य में प्रारंभ करता है?
उदाहरण के लिएनिम्नलिखित संरचना:
typedef struct foo_t_ {
int a;
char b;
int c;
char d;
} foo_t;
कई सिस्टम पर इस (खराब तरीके से तैयार) संरचना 16 के एक sizeof(foo_t)
होगा, वर्ण से प्रत्येक के बाद गद्दी के 6 बाइट्स, 3 बाइट्स की कुल के साथ।
अगर हम जैसी संरचना को प्रारंभ:
foo_t foo = { .a = 1, .b = '2' };
तो खेतों foo.a
1 और foo.b
पर सेट हो जाएगा चरित्र पर निर्धारित किया जाएगा '2'। अनिर्दिष्ट फ़ील्ड (`foo.c 'और' foo.d ') स्वचालित रूप से 0 पर सेट हो जाएंगे। सवाल यह है कि, पैडिंग के 6 बाइट्स का क्या होता है? क्या यह स्वचालित रूप से 0 पर भी सेट हो जाएगा? या यह अनिर्धारित व्यवहार है?
उपयोग के मामले है कि मैं डेटा संरचनाओं की हैश की गणना हो जाएगा:
foo_t foo = { .a = 1, .b = '2' };
foo_t bar = { .a = 1, .b = '2' };
uint32_t hash_foo = calc_hash(&foo, sizeof(foo));
uint32_t hash_bar = calc_hash(&bar, sizeof(bar));
और मुझे यकीन है कि hash_foo
और hash_bar
ही कर रहे हैं होना चाहता हूँ। मैं पहले संरचनाओं को साफ़ करने के लिए memset()
का उपयोग करके इसकी गारंटी दे सकता हूं, फिर उन्हें प्रारंभ कर सकता हूं, लेकिन इसके बजाय सी प्रारंभिकरण का उपयोग करने के लिए क्लीनर लगता है।
प्रैक्टिस में, मेरे सिस्टम पर जीसीसी पैडिंग को भी साफ़ करता है, लेकिन मुझे नहीं पता कि इसकी गारंटी है या नहीं।
किसी भी मामले में उस स्मृति को यूबी होने का संदर्भ नहीं दे रहा है? –
हैश को पैडिंग पर निर्भरता के बिना वास्तविक संरचना सदस्यों का एक फ़ंक्शन क्यों नहीं बनाते? –
आपके उदाहरण में, क्या आप ऐसे मामले का जिक्र कर रहे हैं जहां एक फ़ंक्शन में वैरिएबल को स्थानीय रूप से घोषित किया जा रहा है, या वैश्विक स्तर पर? –