2012-05-25 11 views
14

संभव डुप्लिकेट:
May I treat a 2D array as a contiguous 1D array?क्या यह एक बोली-आयामी सरणी का उपयोग करने के लिए कानूनी है जैसे कि यह एक आयामी वाला है?

निम्नलिखित कोड पर विचार करें:

int array2d[10][10]; 
int *array1d = array2d[0]; 

मैं एक कार्यान्वयन जहां यह काम नहीं होगा कभी नहीं सुना है, लेकिन यह कानूनी है array2darray1d के माध्यम से पहुंच और कुशलतापूर्वक उपयोग करें? मानक का कौन सा वर्ग इस अनुमति देता है? क्या मानक रोकथाम कार्यान्वयन में कुछ भी दूसरे स्तर के सरणी के बीच अतिरिक्त स्थान या पैडिंग डालने से कुछ भी है (इसकी आवश्यकता नहीं है, लेकिन अभी भी)?

बोनस सवाल: वहाँ एक int[100] जो एक reinterpret_cast या एक सी शैली एक की आवश्यकता नहीं है के रूप में array2d पहुंचने का एक तरीका है?

+0

आप इसे हमेशा उस वर्ग में लपेट सकते हैं जो इसे आंतरिक रूप से एक-आयामी सरणी के रूप में संग्रहीत करता है। – chris

+3

सी ++ obfuscated प्रतियोगिता के लिए साइन अप :) :)? – ScarletAmaranth

+1

'int * array1d = array2d [0] नहीं है; 'थोड़ा और सीधा? – ildjarn

उत्तर

5

यदि स्मृति सेवा करता है, तो मानक इसे आधिकारिक रूप से अपरिभाषित व्यवहार का उदाहरण देता है, लेकिन अनिवार्य रूप से हमेशा काम करता है। [संपादित करें: C99, §J.2 (अपरिभाषित व्यवहार):

  • एक सरणी सबस्क्रिप्ट श्रेणी से बाहर है, भले ही एक वस्तु दिया सबस्क्रिप्ट साथ जाहिरा तौर पर पहुँचा जा सकता है (यहाँ मैं क्या करने की सोच रहा था lvalue अभिव्यक्ति में के रूप में एक [1] [7] घोषणा पूर्णांक दिया एक [4] [5])

मैं नहीं कर रहा हूँ हालांकि लागू होने वाला, जैसा कि आप हो रही है पूरी तरह कुछ एक सरणी की शुरुआत का पता और इसे एक साधारण सूचक में संयुक्त रूप से परिवर्तित करना derlying प्रकार।]

Arrays संगत होने की आवश्यकता है, इसलिए यह किसी सरणी के तत्वों के बीच कोई पैडिंग नहीं डाल सकता है। यह सच है कि आपके पास int या सरणी की सरणी है।

0

यह वास्तव में कानूनी है। मानक स्पष्ट रूप से बड़े 1 डी सरणी होने के लिए बहुआयामी सरणी बताता है। मेरे पास हाथ का सटीक उद्धरण नहीं है, लेकिन मुझे पता है कि यह सच है।

+0

मैंने हाल ही में 2 डी सरणी लेआउट पर मानक को खोला है (उत्तर [यहां] (http://stackoverflow.com/questions/10618473/is-this-c-code-portable-assuming-multidimensional-arrays-have-continuous-mem/10618866 # 10618866))। मुझे यकीन नहीं है कि एक भाग 'टी [एन] 'कहता है कि भाग * बिल्कुल *' n * sizeof (टी) 'है। – Jon

+0

मूल रूप से पहले उद्धरण में "शामिल" मुझे थोड़ा परेशान करता है। मजबूत शब्द क्यों नहीं? "शामिल है" बस एक कम बाध्य देता है। – Jon

+2

@ जोन सी ++ 2003, §5.3.3/2: 'sizeof': जब किसी सरणी में लागू किया गया, तो परिणाम सरणी में बाइट्स की कुल संख्या है। इसका तात्पर्य है कि एन तत्वों की सरणी का आकार एन तत्व का आकार एन गुणा है। –

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

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