मैं इस अवधारणा को समझने के लिए संघर्ष कर: मैं एक निश्चित आकार परिभाषा है:सरणी
(http://msdn.microsoft.com/pt-br/library/aa931918.aspx से)
typedef struct _FlashRegion {
REGION_TYPE regionType;
DWORD dwStartPhysBlock;
DWORD dwNumPhysBlocks;
DWORD dwNumLogicalBlocks;
DWORD dwSectorsPerBlock;
DWORD dwBytesPerBlock;
DWORD dwCompactBlocks;
} FlashRegion, *PFlashRegion;
इस FlashRegion struct, यह एक और struct में प्रयोग किया जाता है: (से: http://msdn.microsoft.com/pt-br/library/aa932688.aspx)
typedef struct _FlashInfoEx {
DWORD cbSize;
FLASH_TYPEflashType;
DWORD dwNumBlocks;
WORD dwDataBytesPerSector;
DWORD dwNumRegions;
FlashRegion region[1];
} FlashInfoEx, *PFlashInfoEx;
समस्या है, मैं एक FlashInfoEx अंदर FlashRegions के परिवर्तनशील हो सकता है। समारोह है कि मैं डिबगिंग कोड में यह कहीं करता है:
memcpy (pFlashInfoEx->region, g_pStorageDesc->pRegionTable,
g_pStorageDesc->dwNumRegions * sizeof(FlashRegion));
इसका मतलब है कि यह pFlashInfoEx (है कि मैं समारोह के कॉल में पास) के लिए प्रतियां क्षेत्रों की राशि;
तो, अगर कोड एक से बड़ा होता है तो कोड स्मृति को ओवरराइट करेगा। यदि ऐसा है, तो क्या मुझे अपने कोड में FlashRegion [FIXED_SIZE] बनाना चाहिए और किसी भी तरह FlashInfoEx-> क्षेत्र में स्थान/ओवरराइट करना चाहिए? मैं उसको कैसे करू?
धन्यवाद, मार्सेलो
वाह, तुम लोग यहाँ तेज़ हो! तो, इसका तात्पर्य है कि क्षेत्र हमेशा संरचना के अंतिम सदस्य होना चाहिए? कंपाइलर के आधार पर, क्या यह जोखिम नहीं है? – Marcelo
किसी भी एपीआई के साथ बातचीत करने में सक्षम होने के लिए structs को परिभाषित करते समय आपको संरचना के सटीक मेमोरी लेआउट को परिभाषित करने में सक्षम होना चाहिए। मुझे लगता है कि मानक को निर्धारित क्रम में स्ट्रक्चर सदस्यों को आदेश देने की आवश्यकता है, लेकिन यह संरेखण निर्दिष्ट नहीं करता है। अभ्यास में सभी कंपाइलर संरेखण नियंत्रण भी प्रदान करते हैं। – Suma
हां, क्षेत्र अंतिम होना चाहिए। जोखिम? केवल इस अर्थ में कि सी स्वयं जोखिम भरा है।यह वास्तव में भाषा का उपयोग करने का इरादा था। एक कारण यह है कि आधुनिक भाषाएं इसे असंभव बनाती हैं, लेकिन यह सी 8 9 और सी 0 9 टूलकिट से डिजाइन पैटर्न को पीछे हटाना नहीं करती है। – DigitalRoss