क्रैशिंग मैं केवल & आर पढ़ने के बारे में हूं, और यह सब सी है जो मुझे पता है। मेरा सभी संकलन मिनीजीडब्लू का उपयोग कर विंडोज कमांड लाइन से किया गया है, और मुझे उन्नत डिबगिंग विधियों का कोई ज्ञान नहीं है (इसलिए नीचे मेरे दूसरे कार्यक्रम में "यहूदी डेबग" टिप्पणी है)।मेमोरी आवंटन को समझना, परीक्षण प्रोग्राम
मैं कुछ छोटे परीक्षण कार्यक्रम बनाने की कोशिश कर रहा हूं ताकि मुझे यह समझने में मदद मिल सके कि स्मृति आवंटन कैसे काम करता है। ये पहले जोड़े कार्यक्रम मॉलोक या फ्री का उपयोग नहीं करते हैं, मैं सिर्फ यह देखना चाहता था कि स्मृति को आवंटित किया जाता है और फ़ंक्शन के लिए स्थानीय मानक एरे के लिए आवंटित किया जाता है। विचार यह है कि मैं अपनी चल रही प्रक्रियाओं को राम उपयोग देखने के लिए देखता हूं यह देखने के लिए कि क्या मैं समझता हूं। नीचे दिए गए पहले कार्यक्रम के लिए, यह काम करता है जैसा कि मैंने उम्मीद की थी। alloc_one_meg()
फ़ंक्शन आवंटित करता है और 250,000 4-बाइट पूर्णांक प्रारंभ करता है, लेकिन जैसे ही फ़ंक्शन लौटाता है, उस एमबी को आवंटित किया जाता है। तो अगर मैं लगातार 1000000 बार उस समारोह को कॉल करता हूं, तो मुझे कभी भी अपना रैम उपयोग 1 एमबी से ऊपर नहीं देखना चाहिए। और, यह काम करता है।
#include <stdio.h>
#include <stdlib.h>
void alloc_one_meg() {
int megabyte[250000];
int i;
for (i=0; i<250000; i++) {
megabyte[i] = rand();
}
}
main()
{
int i;
for (i=0; i<1000000; i++) {
alloc_one_meg();
}
}
नीचे इस दूसरे कार्यक्रम के लिए, विचार एक ही बार में एक ही समारोह चल रहा है के 1000 प्रतिलिपियां, जो मैं प्रत्यावर्तन के साथ पूरा किया समारोह से बाहर निकलने की अनुमति नहीं करने के लिए किया गया था। मेरा सिद्धांत यह था कि कार्यक्रम 1 जीबी रैम का उपभोग करेगा इससे पहले कि इसे रिकर्सन समाप्त होने के बाद इसे आवंटित किया जाए। हालांकि, यह रिकर्सन के माध्यम से दूसरे लूप से पहले नहीं मिलता है (मेरी यहूदी डीबग टिप्पणी देखें)। कार्यक्रम एक सुंदर गैर-सूचनात्मक (मेरे लिए) संदेश के साथ दुर्घटनाग्रस्त हो जाता है (एक विंडोज पॉप-अप कह रहा है ____। Exe में कोई समस्या आई है)। आम तौर पर मैं हमेशा अपने यहूदी डेबग विधि के साथ चीजों के नीचे पहुंच सकता हूं ... लेकिन यह यहां काम नहीं कर रहा है। मैं उलझन में हूं। इस कोड के साथ समस्या क्या है? धन्यवाद!
#include <stdio.h>
#include <stdlib.h>
int j=0;
void alloc_one_meg() {
int megabyte[250000];
int i;
for (i=0; i<250000; i++) {
megabyte[i] = rand();
}
j++;
printf("Loop %d\n", j); // ghetto debug
if (j<1000) {
alloc_one_meg();
}
}
main()
{
alloc_one_meg();
}
अनुवर्ती प्रश्न here पोस्ट किया गया।
और अब जब आपके पास एक स्टैक ओवरफ़्लो क्रैश है, तो आपके पास स्मृति की एक बेहतर समझ है। मजेदार है कि चीजें इस तरह कैसे काम करती हैं। –
हाँ, मैं प्रोग्रामिंग के लिए नया हूं, लेकिन परीक्षण के विचार के लिए नया नहीं हूं। मैं एक इंजीनियर और एक भारी सॉफ्टवेयर यूजर हूं, और मुझे अच्छी तरह पता है कि चीजों को तोड़ने का सबसे अच्छा तरीका है! :-) – The111