2009-06-01 24 views
5

के साथ कई अनुक्रमित लापता आवेदन (नीचे) के उत्पादन के लिए इस प्रकार है:पाश segfault

तत्व सूचकांक संख्या: 0 तत्व सामग्री: 22
तत्व सूचकांक संख्या: 1 तत्व सामग्री: 22
तत्व सूचकांक संख्या: 2 तत्व सामग्री: 22
तत्व इंडेक्स नंबर: 3 तत्व सामग्री: 22
तत्व सूचकांक संख्या: 4 तत्व सामग्री: 22
तत्व सूचकांक संख्या: 22 तत्व सामग्री: 134513712

5 - 21 लेबल किए गए इंडेक्स तत्व क्यों चूक गए हैं? मैं समझता हूं कि यह कोड सरणी को अवरुद्ध करने वाली सरणी की सीमाओं पर कर सकता है, इसे ऐसा करने के लिए डिज़ाइन किया गया है, मुझे कोई दिलचस्पी नहीं है कि यह कोड खराब क्यों है, बस कुछ इंडेक्स क्यों छोड़े गए हैं।

#include <stdio.h> 
int main(){ 

int array[5]; 

int i; 
for(i=0; i<10; ++i){ 
    array[i] = 22; 
    printf("Element index number: %d Element contents: %d\n", i, array[i]); 
} 
return 0; 
} 
+1

इसी तरह के प्रश्न देखें http://stackoverflow.com/questions/795194/too-many-elements-in-an-array –

उत्तर

7

क्या हो रहा है यह है कि जब आप सरणी लिखते हैं [5] आप मुझे लिख रहे हैं। वे स्मृति में, ढेर में आसन्न हैं, इसलिए यह वह व्यवहार है जिसे आप उम्मीद कर सकते हैं।

सोचो इस तरह से इसके बारे में,

आप

int array[5]; 

वास्तविकता में सुबह 5 तत्वों के साथ एक सरणी बनाया है, सरणी सिर्फ एक का पता है। [] में संख्या निर्दिष्ट करता है कि उस पते को कितना दूर करने के लिए। तो:

  • सरणी [0] स्मृति अतीत पता "सरणी" में 0 ints
  • सरणी [1] स्मृति अतीत पते में 1 ints "सरणी" है ...
  • सरणी [4] है स्मृति अतीत पता "सरणी" में 4 ints

इसलिए यदि आप के लिए

  • सरणी सभी तरह मिल [5] स्मृति पी में 5 ints है (पिछले आप सरणी के लिए आरक्षित int) अस्थ पता "सरणी"

सी में स्वचालित रूप से जांच करने की कोई सीमा नहीं है, इसलिए आपकी अपनी स्मृति को ओवरराइट करने में खुशी होती है। आपने स्टैक में सरणी [5] के बाद "i" रखा है, सबसे अधिक संभावना सरणी [5] मैं है।

आप केवल सरणी [5], या i, 22 को सेट करते हैं, इसलिए मैं 22 वर्ष का हूं। अब मैं 22 वर्ष का हूं, आपका अगला लुकअप सरणी में है [i] वास्तव में सरणी है [22]। यह स्मृति में उस स्थान पर जो भी जंक होता है उसे पकड़ता है; या यदि आप भाग्यशाली हैं, दुर्घटनाएं।

+0

"जब आप सरणी में लिखते हैं [6] आप मुझे लिख रहे हैं" सरणी [5] 'होना चाहिए, जैसा कि आप सही ढंग से करते हैं बाद में लिखो –

+1

ध्यान दें कि जहां सरणी समाप्त होती है और मैं शुरू करता हूं कार्यान्वयन और आर्किटेक्चर निर्भर है, इसलिए एक अलग कंपाइलर, विभिन्न ओएस संस्करण, विभिन्न ओएस या विभिन्न आर्किटेक्चर पर, आप पूरी तरह अलग परिणाम प्राप्त कर सकते हैं। –

9

एक बार जब आप आबंटित स्मृति अतिप्रवाह, आप "अपरिभाषित क्षेत्र" में हैं। संभवतः सरणी लिखने के लिए लिखा गया था कि "i" स्टैक पर संग्रहीत किया गया था।

ध्यान दें कि जावा और सी # जैसी भाषाओं के विपरीत, सी कोई रन-टाइम सीमा जांच नहीं करता है, इसलिए जब आप किसी सरणी या स्ट्रिंग या मॉलोकर्ड मेमोरी को ओवरराउन करते हैं तो कुछ भी उपयोगी (जैसे segfault) करने की गारंटी नहीं है। यह कुछ भी करने की गारंटी नहीं है। यह दुर्घटनाग्रस्त हो सकता है, यह चल रहा है, it could cause demons to fly out your nose

+6

यह वही है जो हो रहा है। "सरणी" और "मैं" दोनों स्टैक पर संग्रहीत हैं, "i" तुरंत "सरणी" का पालन करते हुए। तो और सरणी [5] सटीक उसी स्थान को संदर्भित करती है जैसे मैं और i। सरणी पर लिखना [5] स्टैक पर मेरे स्थान पर संग्रहीत मूल्य को लिख देगा। आपके लूप में जब आप सरणी बहती हैं, तो मैं 22 लिख रहा हूं, इसलिए 4 से 22 तक कूद। –

0

सबसे अधिक संभावना स्थानीय चर के लिए भंडारण "i" तुरंत ढेर पर "सरणी", इसलिए & सरणी [5] == & मैं, आप 22 बताए जाते हैं करने के लिए "मैं" जब आप 22 आवंटित जिसका अर्थ है के बाद स्थित है सरणी [5] के लिए।

-1

आपने 5 इंच की एक सरणी घोषित की है, लेकिन आपके लूप के लिए मान 10 प्रविष्टियों में लिखते हैं।

बदलें

int array[5]; 

int array[10]; 
+0

क्षमा करें ... डाउनवोट क्योंकि आपने शायद प्रश्न भी नहीं पढ़ा है: ... सरणी की सीमाएं बहती हैं, इसे करने के लिए डिज़ाइन किया गया है, मुझे कोई दिलचस्पी नहीं है कि यह कोड खराब क्यों है ... –

2

को @Doug यह है, लेकिन यह एक बिट का विस्तार करते हैं।

आपके पास सरणी [5] और मैं ऑटो चर के रूप में है, इसलिए उन्हें प्रविष्टि पर ढेर पर आवंटित किया जाता है, इसलिए आप 6 कक्ष आवंटित करते हैं: सरणी [0], सरणी [1], ... सरणी [4] , और तब मैं।

जब आप मुझे 5 पर सेट करते हैं, सरणी [i] I युक्त स्टैक पर सेल की ओर इशारा करते हैं। फिर आपने 22 को सौंपा। तो अब मैं = 22, जैसा कि आपने मुद्रित किया था।

फिर आपको सरणी [i] या सरणी [22] मिलती है, जो स्टैक के अंत से नीचे है; उस बड़ी संख्या में यादृच्छिक मूल्य होता है।

+0

अच्छे से कहा। उस विवरण को जोड़ने के लिए किसी के जवाब की आवश्यकता होती है "फिर आपको सरणी [i] या सरणी मिलती है [22] ..." –

+0

ओह, मैंने अभी यह सब जोड़ा है, यह सुनिश्चित नहीं है कि हम में से कौन सा पहले इसे कहता है। आपको +1 –

+0

हमने पार किया - और मैंने आपको उसी कारण से +1 किया। –