मैं आज एक बहुत ही अजीब समस्या में भाग गया। लंबी कहानी छोटी, मेरा फ़ंक्शन एक मान देता है, कॉलर को एक अलग मूल्य मिलता है।सी फ़ंक्शन चेंज वैल्यू। दूषित ढेर?
Message* m = NULL;
m = connection_receive(c);
कहाँ connection_receive के रूप में परिभाषित किया गया है इस प्रकार है::
Message* connection_receive(Connection* c)
{
Message* k;
if (c->state == CON_STATE_AUTHENTICATED)
{
pthread_mutex_lock(&c->mutex_in);
if (g_queue_is_empty(c->in))
k = NULL;
else
k = (Message*)g_queue_pop_head(c->in);
pthread_mutex_unlock(&c->mutex_in);
/* Until here, k is reachable and contains the correct data. */
return k;
}
else
return NULL;
}
यहाँ एक gdb रन है, मैं सही वापसी से पहले और सही काम करने के बाद बंद कर दिया:
कहीं मेरे कोड के आसपास मैं को कॉल किया222 return k;
(gdb) p k
$1 = (Message *) 0x7ffff0000950
(gdb) n
226 }
(gdb) n
main() at src/main.c:57
57 if (m)
(gdb) p m
$2 = (Message *) 0xfffffffff0000950
बेशक, अगर हम 0xfffffffff0000950 तक पहुंचने का प्रयास करते हैं तो हमें एक सेगमेंटेशन गलती मिल जाएगी।
यदि मैं फ़ंक्शन को बदलता हूं और मूल्य लौटने के बजाय दूसरे मान का उपयोग करके एक मान वापस करने के बजाय, लेकिन मैं जानना चाहता हूं कि इस पर क्या गलत हुआ।
बहुत बहुत धन्यवाद।
संपादित करें: यह काम करता है, लेकिन यह सुविधाजनक नहीं है। और मैं यह भी जानना चाहूंगा कि ऐसी अजीब त्रुटि क्यों हो रही है।
void connection_receive2(Connection* c, Message** m)
{
if (c->state == CON_STATE_AUTHENTICATED)
{
pthread_mutex_lock(&c->mutex_in);
if (g_queue_is_empty(c->in))
*m = NULL;
else
*m = (Message*)g_queue_pop_head(c->in);
pthread_mutex_unlock(&c->mutex_in);
}
else
*m = NULL;
}
EDIT2: हल। सबको शुक्रीया। समस्या हेडर फ़ाइल पर एक टाइपो थी। मैं इसका उपयोग नहीं कर सकता - आतंक क्योंकि मुझे ऐसी चीजें करने की ज़रूरत है जो कुछ चेतावनियां उठाएं, और बड़े पैमाने पर आउटपुट और बड़े हेडर में मैंने इसे याद किया।
मैंने यह एक बार किया था। 'फिन' ने एक रिटर्न वैल्यू दिखाया और वैरिएबल जिसे इसे दूसरे में दिखाया गया था। एक पुनर्मूल्यांकन ने इसे मेरे लिए तय किया (स्रोत को भी नहीं बदला); सबसे अच्छा मैं अनुमान लगा सकता हूं कि एक आश्रित ऑब्जेक्ट फ़ाइल को पुनः प्राप्त नहीं किया गया है, अन्यथा संभवतः जीसीसी में शायद ही कभी (शायद ही कभी सामना किया गया) बग। – Kevin
आपको इसे एक [एसएससीसीई] (http://sscce.org/) पर उबालने की ज़रूरत है जो समस्या का प्रदर्शन करती है और इसे पोस्ट करती है - आपके द्वारा पोस्ट किए गए कोड में कुछ भी गलत नहीं है; समस्या कहीं और है। –
@ ब्रायनरोच, मैं देखता हूं कि मैं क्या कर सकता हूं। यह एक बड़ी परियोजना है। – Victor