2013-07-09 6 views
6

की गतिशील स्मृति आवंटन मैं malloc का उपयोग कर गति 2, गतिशील रूप से एक सरणी बनाने की कोशिश कर रहा हूं।पूर्णांक सरणी

int *d = (int*)malloc(2 * sizeof(int)); 
d[0] = 4; 
d[1] = 5; 
d[2] = 8; 
d[3] = 9; 
d[4] = 7; 
int i; 

for (i = 0; i < 5; i++) 
    printf("%d \n", d[i]); 

मुझे इस कोड चलाने के लिए, यह 4, 5, 8, 9, 7 प्रिंट: यहाँ मेरी कोड है।

मुझे आश्चर्य है कि यह अनुरोध किए गए (2 पूर्णांक) से अधिक मेमोरी (5 पूर्णांक) आवंटित करने में सक्षम था?

+1

आपका कोड व्यवहार अलग-अलग निष्पादन पर अनिर्धारित माध्यम है, आप अलग-अलग व्यवहार देख सकते हैं, आप पहले से भविष्यवाणी नहीं कर सकते हैं, आपका प्रोग्राम कभी-कभी क्रैश हो सकता है। यह कोड गलत है! अविश्वसनीय दुर्भाग्य से सी संकलक इसकी रिपोर्ट नहीं करता है। –

उत्तर

9

मुझे आश्चर्य है कि यह अनुरोध किए जाने से अधिक मेमोरी आवंटित करने में सक्षम था।

ऐसा नहीं हुआ। आप अपरिभाषित व्यवहार का आह्वान कर रहे हैं। एक संभावित परिणाम * यह है कि आपका प्रोग्राम "काम" प्रतीत होता है।


* तर्कसंगत रूप से, सबसे खराब।

3

ओली की तरह, यह अपरिभाषित है। यह काम कर सकता है, यह नहीं हो सकता है। लेकिन वास्तविकता यह है कि भले ही यह 99% समय काम कर सके, यह कम से कम एक बार विफल हो जाएगा, और आपको SEGFAULT मिल जाएगा जो स्मृति को पढ़ने या लिखने से आपकी प्रक्रिया का उपयोग नहीं किया जा रहा है, और आप 'वर्चुअल अन-डिबग करने योग्य मेमोरी लीक के साथ भी समाप्त हो जाएगा।

1

सी सीमाओं की जांच नहीं करता है। आप स्मृति पर stomping कर रहे हैं कि आपके कार्यक्रम का स्वामित्व नहीं है।

1

जब आप अपरिभाषित व्यवहार का आह्वान कर रहे हैं, तो आप कभी नहीं जानते कि क्या हो सकता है।

4, 5, 8, 51, 1629501832

2

क्या सुझाव दिया गया है के अलावा मैं कुछ अतिरिक्त नोट्स जोड़ सकता है अगर उदाहरण के लिए: जब मैं कार्यक्रम भाग गया मैं अपने आउटपुट के रूप में निम्नलिखित मिला है।

यह सुनिश्चित नहीं है कि आप इसे किस ओएस पर चल रहे हैं, लेकिन यदि आप किसी भी समय लिनक्स पर हैं तो आपको यकीन है कि अगर कुछ काम करना चाहिए या valgrind के माध्यम से इसे चलाने के लिए अनिश्चित हैं। मेरे मामले में यह आपके कोड के साथ सभी त्रुटियों के बारे में एक अच्छी रिपोर्ट संकलित (जिसमें malloc -ed स्मृति को मुक्त नहीं किया गया है)।

मुझे स्मृति के लिए किए गए तीन अतिरिक्त लिखने के लिए तीन Invalid write of size 4 मिला। यह भी मुझे अमान्य स्मृति है कि आप Invalid read of size 4 साथ पाश में पढ़ रहे हैं के बारे में सूचित और अंत में यह मुझे अपने कोड में लीक पर कुछ आँकड़े दिया:

HEAP SUMMARY: 
    in use at exit: 8 bytes in 1 blocks 
    total heap usage: 1 allocs, 0 frees, 8 bytes allocated 

LEAK SUMMARY: 
    definitely lost: 8 bytes in 1 blocks 
अंत में

, don't cast the result of malloc.

1

कारण यह प्रतीत होता है के लिए काम इसलिए है क्योंकि आप स्मृति में नए स्पॉट को इंगित करने के लिए अपने पॉइंटर को बढ़ा रहे हैं (जिसे आपका प्रोग्राम उपयोग करने के लिए आवंटित किया जा सकता है या नहीं)। मुझे लगता है कि आप इसे ढेर पर घोषित कर रहे हैं और यही कारण है कि आपका अपरिभाषित व्यवहार "ठीक" प्रतीत होता है।

मुझे नहीं लगता कि आप एक सूचक और आपके द्वारा उपयोग किए जाने वाले वाक्यविन्यास की शक्ति को समझते हैं।टिप्पणी को निम्नलिखित बराबर है:

int arr[ 2 ] = { 1, 2 }; 
int *pi = &arr; 

// The following output is equivalent to... 
for (int i = 0; i < 2; i++) { 
    printf("arr[i] = %d.\n", arr[ i ]); 
} 

// this. 
for (int i = 0; i < 2; i++) { 
    printf("*(p + i) = %d.\n", *(p + i)); 
} 

इस, अपने कोड के वैकल्पिक कार्यान्वयन पर विचार पर जोर देना कि कैसे आप अपने सरणी के बाहर अनुक्रमण तत्वों द्वारा नई स्मृति पतों ओर इशारा करते हैं।

int *d = (int *)malloc(2 * sizeof(int)); 

*(d + 0) = 4; // Observe you are accessing the memory location d points to. 
*(d + 1) = 5; // Observe you are accessing the memory location d + 4 bytes (or 8 if 64-bit) points to... 
*(d + 2) = 8; // ... 
*(d + 3) = 9; // ... 
*(d + 4) = 7; // Observe you are assigning a value to the memory location of d + 24 bytes (or 48 bytes if 64-bit). 

for (int i = 0; i < 5; i++) { 
    printf("%d \n", *(d + i)); 
} 

बस अपने कोड पर एक त्वरित नोट। एक मॉलोक को आम तौर पर मुफ्त में पालन किया जाना चाहिए - इसलिए इसे उचित रूप से उपयोग करें ताकि कोई मेमोरी लीक न हो।

मुझे आशा है कि इससे मदद मिलेगी! अगर मैंने गलती की तो मुझे सही करने के लिए स्वतंत्र महसूस करें।

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