2011-04-12 18 views
5

हर किसी को परेशान करने के लिए खेद है, लेकिन इससे मुझे कुछ दर्द हो रहा है। कोड यह रहा:sprintf के साथ संघर्ष ... कुछ बेवकूफ?

char buf[500]; 
sprintf(buf,"D:\\Important\\Calibration\\Results\\model_%i.xml",mEstimatingModelID); 

mEstimatingModelID एक पूर्णांक है, वर्तमान में पकड़े मूल्य 0.

काफी सरल है, लेकिन डिबगिंग यह हो रहा है पता चलता है:

0x0795f630 "n\Results\model_0.xml" 

अर्थात यह स्ट्रिंग की शुरुआत गायब है।

कोई विचार? यह साधारण सामान है, लेकिन मैं इसे समझ नहीं सकता।

धन्यवाद!

+2

आप यकीन है कि यह डिबगर आप बेवकूफ बनाना नहीं है कर रहे हैं? ऑप्टिमाइज़ेशन बंद या बंद करने के साथ डीबग बिल्ड का प्रयास करें, 'buf' के मान को प्रिंट करें। –

+2

आप परिणाम की जांच कब कर रहे हैं: इस समारोह में, या कुछ समय बाद? आप इस फ़ंक्शन से "buf" पर पॉइंटर वापस नहीं कर रहे हैं, है ना? आप शायद यह जानते हैं, लेकिन आप किसी फ़ंक्शन से स्टैक-आधारित चर में पॉइंटर वापस नहीं कर सकते हैं; जैसे ही फ़ंक्शन लौटाता है वैरिएबल कचरा बन जाता है। –

+2

विचार में स्टैंडअलोन काम करता है - http://www.ideone.com/wJJ6o, ऐसा लगता है कि आपका डीबगर खेल रहा है। –

उत्तर

3

यह एक वास्तविक सामान्य जवाब बनाने के प्रयास में: यहाँ समान त्रुटियों के लिए एक चेकलिस्ट है:

  • कभी भरोसा है कि तुम क्या रिलीज़ मोड में देखते हैं, विशेष रूप से स्थानीय चर कि ढेर स्मृति से आवंटित किया गया है। ढेर डेटा में मौजूद स्थिर चर एकमात्र चीज हैं जो आम तौर पर सही होंगी, फिर भी, भरोसा न करें। (उपरोक्त उपयोगकर्ता के लिए कौन सा मामला था) यह मेरा अनुभव रहा है कि वीएस के हाल के संस्करणों में कम भरोसेमंद रिलीज मोड डेटा है (शायद बी/सी वे रिलीज में और अधिक अनुकूलित करते हैं, या शायद यह 64bitness या जो भी हो)

  • हमेशा सत्यापित करें कि आप सही फ़ंक्शन में चर की जांच कर रहे हैं। उच्च कार्य में "buf" नामक एक चर होना बहुत आसान है जिसमें इसमें कुछ अनियमित कचरा है। यह निचले subroutine/समारोह में एक ही नामित चर के साथ आसानी से भ्रमित हो जाएगा।

  • बफर ओवररन्स के लिए दोबारा जांचना हमेशा अच्छा विचार है। यदि आप कभी भी अपने sprintf में% s का उपयोग करते हैं, तो आप एक बफर ओवररन प्राप्त कर सकते हैं।

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

+0

आप यह भी जोड़ सकते हैं कि 'snprintf() 'बड़े पैमाने पर बफर ओवरफ़्लो समस्याओं से बच सकता है, हालांकि एमएस द्वारा प्रदान किया गया संस्करण सी 99 मानक के साथ पूरी तरह से अनुपालन नहीं करता है और यह एक शून्य-समाप्त स्ट्रिंग (एमएस को सबसे अच्छी तरह से ज्ञात कारणों के लिए) की गारंटी नहीं देता है। –

+1

+1 जो डीबगर में रिलीज मोड में जो भी देखता है उस पर विश्वास न करने के लिए +1। – Xeo

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