2010-04-21 15 views
7

मैं वाल्ग्रिंड के साथ एक सेगफॉल्ट का पता लगाने की कोशिश कर रहा हूं। मैं valgrind से निम्न संदेश मिलता है:वालग्रिंड कहते हैं, "आवंटन ढेर," मैं कहता हूं "ढेर आवंटन"

/* allocate mating table */ 
    age_dep_data->mtable = malloc (age_dep_data->geno * sizeof (double *)); 
    if (age_dep_data->mtable == NULL) 
    error (ENOMEM, ENOMEM, nullmsg, __LINE__); 
    for (int j = 0; j < age_dep_data->geno; j++) 
    {  
131=>  age_dep_data->mtable[j] = calloc (age_dep_data->geno, sizeof (double)); 
     if (age_dep_data->mtable[j] == NULL) 
error (ENOMEM, ENOMEM, nullmsg, __LINE__); 
    } 

क्या देता है:

==3683== Conditional jump or move depends on uninitialised value(s) 
==3683== at 0x4C277C5: sparse_mat_mat_kron (sparse.c:165) 
==3683== by 0x4C2706E: rec_mating (rec.c:176) 
==3683== by 0x401C1C: age_dep_iterate (age_dep.c:287) 
==3683== by 0x4014CB: main (age_dep.c:92) 
==3683== Uninitialised value was created by a stack allocation 
==3683== at 0x401848: age_dep_init_params (age_dep.c:131) 
==3683== 
==3683== Conditional jump or move depends on uninitialised value(s) 
==3683== at 0x4C277C7: sparse_mat_mat_kron (sparse.c:165) 
==3683== by 0x4C2706E: rec_mating (rec.c:176) 
==3683== by 0x401C1C: age_dep_iterate (age_dep.c:287) 
==3683== by 0x4014CB: main (age_dep.c:92) 
==3683== Uninitialised value was created by a stack allocation 
==3683== at 0x401848: age_dep_init_params (age_dep.c:131) 

हालांकि, यहां हमलावर लाइन है? मैंने सोचा कि मॉलोक या कॉलोक आवंटित ढेर अंतरिक्ष के लिए कोई भी कॉल; यहाँ आवंटित कोई अन्य चर नहीं है, है ना? क्या यह संभव है कि एक और आवंटन चल रहा हो (अपमानजनक ढेर आवंटन) जिसे मैं नहीं देख रहा हूं?

संपादित करें: मेरा वर्तमान संदेह एक स्टैक-आवंटित सरणी है: मैं एक पॉइंटर को डबल (स्टैक) घोषित करता हूं, फिर इसे एक फ़ंक्शन का परिणाम देता हूं जो डबल * देता है। फिर मैं इसे पहले आवंटित स्थान पर याद करता हूं।

मैं स्टेक वैरिएबल को याद नहीं कर सकता, याद नहीं कर सकता या फिर असाइन नहीं कर सकता, तो उम्मीद है कि यह जारी रहेगा, क्या मैं कर सकता हूं?

+0

क्या हम कुछ और कोड देख सकते हैं? शायद age_dep.c – eyalm

उत्तर

-1

मैं के बाद से पता चला है कि इस valgrind त्रुटि

Conditional jump or move depends on uninitialised value(s) 

हर समय होता है और त्रुटि के स्रोत नहीं है। ऐसा लगता है कि इस प्रश्न को पोस्ट करने के बाद मुझे लगता है कि ज्यादातर मामलों में यह एक लाल हेरिंग प्रतीत होता है।

+1

जोएल, नहीं, यह कभी लाल हेरिंग नहीं होता है, और आपको हमेशा इसे ठीक करना चाहिए। यह संभावित रूप से एक बेहद गंभीर बग है (हालांकि कभी-कभी हानिरहित)। –

0

संभावित कारण:
आप double* रूप age_dep_data->mtable परिभाषित लेकिन यह double** होना चाहिए सरणियों की एक सरणी

+0

क्या मैं यह कर रहा हूं? मैं आकार एन * (एक पॉइंटर का आकार डबल करने के लिए) का एक सरणी आवंटित करता हूं, फिर उस सरणी में प्रत्येक पॉइंटर के लिए मैं आकार एम * (डबल का आकार) आवंटित करता हूं। क्या मुझे malloc() पर कॉल में आकार (डबल **) का उपयोग करने की आवश्यकता है? –

+1

नहीं, आप कोड ओकी है; हम age_dep_data-> mtable की घोषणा नहीं देख सकते - इसे डबल ** –

+0

के रूप में घोषित किया जाना चाहिए इसे एक संरचना के भीतर डबल ** घोषित किया गया है (गतिशील रूप से आवंटित)। –

2

मैं समस्या क्या है पता नहीं है हो सकता है, लेकिन

-track-origins=yes 

मदद कर सकता है इसके बारे में आपको और जानकारी मिलती है कि यह किस बारे में शिकायत कर रहा है; जानकारी के लिए इस ब्लॉग पोस्ट देखें: http://blog.mozilla.com/nnethercote/2009/02/27/eliminating-undefined-values-with-valgrind-the-easy-way/

+0

पास करता हूं मैं ट्रैक-उत्पत्ति का उपयोग कर रहा हूं; मैं उसका उल्लेख करना भूल गया। क्या यह मुझे भटक सकता है? –

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