2012-06-27 4 views
9

शायद मैं गुगलिंग के लिए बहुत डंप हूं, लेकिन मैंने हमेशा सोचा कि चार सरणी केवल शाब्दिक प्रारंभिक (char x[]="asdf";) द्वारा समाप्त हो जाती है और मुझे आश्चर्य हुआ कि जब मैंने देखा कि ऐसा नहीं लगता है।क्या सभी चार सरणी स्वचालित रूप से निरस्त हो जाती हैं?

int main() 
{ 
    char x[2]; 
    printf("%d", x[2]); 
    return 0; 
} 

आउटपुट: 0

चाहिए नहीं एक सरणी आकार = 2 * 2 वर्ण का आकार चार वास्तव में प्राप्त के रूप में घोषित? या मैं यहाँ कुछ गलत कर रहा हूँ? मेरा मतलब है कि एक चार सरणी को एक साधारण चार सरणी के रूप में उपयोग करना असामान्य नहीं है, न कि एक स्ट्रिंग के रूप में, या है ना?

उत्तर

20

आप इसकी सीमाओं के बाहर एक अनियमित सरणी तक पहुंच रहे हैं। यह डबल अपरिभाषित व्यवहार है, कुछ भी हो सकता है, यहां तक ​​कि आउटपुट के रूप में 0 भी प्राप्त हो रहा है।

अपने असली सवाल के जवाब में: केवल स्ट्रिंग शाब्दिक प्राप्त अशक्त-समाप्त, और इसका मतलब है कि char x[]="asdf"5 तत्वों की एक सरणी है।

+0

मैंने इसके बारे में भी सोचा है, इसलिए मैंने विभिन्न आकारों के साथ सरणी बनाने की कोशिश की और सरणी हमेशा 0 के बाद थी। (मेरे नमूने में दिखाया गया 0 0 के बाद नहीं था, लेकिन आकार के साथ एक सरणी 3 * एक ही स्थान पर चार था) – user1329846

+0

@ user1329846: सरणी समाप्त होने के बाद मेमोरी में जो कुछ भी संग्रहीत किया जाता है, वह कंपाइलर तक होता है, आपको 0 मिल रहा है लेकिन मानक के रूप में कोई अन्य नंबर भी प्राप्त हो सकता है यदि आप इसे पढ़ने का प्रयास करते हैं स्थान सभी दांव बंद हैं। मुझे यह स्पष्ट करने दें: भले ही आप भाग्यशाली थे, हमेशा वहां 0 प्राप्त करने के लिए, आपका कोड अभी भी _undefined व्यवहार_ को ट्रिगर करता है और किसी भी समय विफल हो सकता है। –

+0

'कुछ भी हो सकता है, यहां तक ​​कि आपका कंप्यूटर आग पर सेट कर सकता है' का उपयोग न करने के लिए धन्यवाद। नहीं, यह नहीं कर सकता। और उन सभी भव्य उदाहरण सिर्फ बेवकूफ हैं। – jn1kk

3

char सरणी स्वचालित रूप से न्यूल समाप्त हो गया, केवल स्ट्रिंग अक्षर, उदा। char *myArr = "string literal";, और कुछ स्ट्रिंग चार पॉइंटर्स stdlib स्ट्रिंग विधियों से लौट आए।

सी कोई सीमा जांच नहीं करता है। इसलिए आकार 2*char के रूप में घोषित एक सरणी आपको 2 स्मृति स्लॉट देता है जिसका उपयोग आप कर सकते हैं, लेकिन आपके पास उस स्मृति के सभी तरफ चलने, पढ़ने और लिखने की स्वतंत्रता है और इस तरह अपरिभाषित व्यवहार का आह्वान किया जाता है। आप 0 बाइट्स देख सकते हैं। आप array[-1] पर लिख सकते हैं और अपने प्रोग्राम को क्रैश कर सकते हैं। अपनी सरणी के आकार को ट्रैक रखना और स्मृति को छूने से बचाना आपकी ज़िम्मेदारी है जिसे आपने आवंटित नहीं किया था।

एक सर सर सरणी के रूप में एक चार सरणी का उपयोग करना आम है, यानी सी स्ट्रिंग के अलावा, कच्चे बाइट्स के किसी भी मनमाने ढंग से बफर को पकड़ने के लिए।

0

तो t आकार 2 की एक सरणी है, तो पिछले मामले t[2 - 1] = t[1] और नहीं 2. t[2] है सीमा से बाहर है।

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