2012-03-25 16 views
6

सी में मेरे arduino microcontroller बोर्ड प्रोग्रामिंग, मैंने एक अजीब व्यवहार देखा।क्या सरणी [-1] सरणी में अंतिम तत्व देता है?

मेरे प्रोग्राम में एक तर्क गलती के कारण नियंत्रक ने -1 एक पूर्णांक सरणी के वें तत्व का उपयोग किया।

int array[5]; 

array[4] = 27; 
// array[-1] gives 27 now. 

यह सही है कि मैं तत्व चयनकर्ता के रूप में -1 का उपयोग करके एक सरणी के अंतिम तत्व मिल सकता है?

+0

क्या यह हो सकता है कि, उसी तार्किक त्रुटि के कारण, आपने पहले उस स्थान पर * लिखा * लिखा था और फिर उसे वापस पढ़ने की अपेक्षा की थी? – Irfy

+0

@Irfy मुझे पता है कि आप क्या सोचते हैं लेकिन यह मामला नहीं है। – danijar

उत्तर

13

नहीं, सूचकांक सीमा के बाहर तत्वों तक पहुंच अपरिभाषित व्यवहार है। आपके मामले में, आपके सरणी की शुरुआत से ठीक पहले पते पर तत्व 27 पर सेट किया गया है।

सी में सरणी तत्वों तक पहुंचने के बाद से "सीधे" पॉइंटर अंकगणित करने से कुछ भी नहीं है, नकारात्मक इंडेक्स को गुजरने की अनुमति नहीं है। आप वैध उपयोग केस बना सकते हैं जहां इंडेक्स नकारात्मक और सकारात्मक हैं:

int raw[21], *data = &raw[10]; 
for (int i = -10 ; i <= 10 ; i++) { 
    data[i] = i; 
} 
+0

मैंने कार्यक्रम चलाया लेकिन यह दुर्घटनाग्रस्त नहीं हुआ। मैं समझता हूं कि अंकगणितीय ऑपरेशन हो रहा है। यह आश्चर्य की बात है कि जीसीसी कंपाइलर त्रुटि के रूप में शिकायत नहीं करता है और न ही कोई चेतावनी देता है। क्या आप जानते हैं कि वह क्यों है? –

6

नहीं; array[-1] अंतिम तत्व तक नहीं पहुंच जाएगा। यह अधिक संभावना है कि सरणी से पहले स्मृति स्थान 27 इसमें संग्रहीत है। इसे आज़माएं:

array[4] = 27; 
array[-1] = 0; 

फिर परीक्षण करें कि array[-1] == array[4]। वे बराबर नहीं होंगे (माना जाता है कि array[-1] को असाइन करते समय आपका प्रोग्राम क्रैश नहीं होता है)।

1

नहीं, यह मानक के अनुसार गलत है। सरणी के बाहर एक तत्व तक पहुंचने से अनिर्धारित व्यवहार का आह्वान होता है।

आपका कार्यान्वयन (मुझे शक है!) उस कार्यक्षमता प्रदान करता है; लेकिन आपको वास्तव में पर भरोसा करना चाहिए।

2

सीमाओं से बाहर सूचकांक के साथ सरणी एक्सेस करना हमेशा आपके प्रोग्राम को क्रैश नहीं करता है। यदि -1 द्वारा एक्सेस की गई मेमोरी आपके प्रोग्राम नियंत्रण में है, तो एक अपरिभाषित मान पॉप आउट हो जाएगा (जिसे आपके प्रोग्राम द्वारा बनाए गए किसी अन्य डेटा द्वारा संग्रहीत किया गया था)। आपके मामले में यह केवल संयोग है।

-4

यदि आप सी (और आप हैं) का जिक्र कर रहे हैं, तो नहीं। यदि आप एक नकारात्मक इंडेक्स के साथ सरणी तक पहुंचने का प्रयास करते हैं, तो आपको सीमा अपवाद से बाहर निकलना होगा। हालांकि, लुआ इस सुविधा को एक सुविधा के रूप में लागू करता है। यदि आप -1 की अनुक्रमणिका के साथ लुआ सरणी तक पहुंचते हैं, तो यह सरणी के अंतिम तत्व को पढ़ेगा। -2 की एक अनुक्रमणिका दूसरे-से-अंतिम तत्व को पढ़ेगी, और इसी तरह।

साइड नोट: यदि आप इस

foo = {1,2,3,4,5,6,7,8,9,0} 
print(foo.length() * -1]) 

यह प्रिंट 1. कष्टप्रद लिख कर अपने सहकर्मियों परेशान कर सकते हैं, ऐसा नहीं है।

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