2012-03-04 23 views
5

मेरे कोड के नीचे की तरह है:सी ++ मेमोरी आवंटन मुद्दे

#include <string.h> 
int main() 
{ 
    int ii = 123; 
    char str[7] = ""; 
    strcpy(str,"123456"); 
    return 0; 
} 

मैं VS2010 में इस चलाने के लिए, स्मृति की तरह है नीचे

enter image description here

मैं उत्सुक क्या स्मृति में cc इस्तेमाल किया हूँ के लिये? और cc की संख्या की गणना कैसे की जाती है?

उत्तर

7

विजुअल स्टूडियो में "डीबग" के लिए संकलित करते समय, cc अक्सर अनियमित स्मृति को भरने के लिए उपयोग किया जाता है। इस तरह जब आप अनियमित स्मृति तक पहुंचते हैं तो यह अधिक स्पष्ट होता है।

Access Violation accessing 0xcccccccc 

या ऐसा ही कुछ:

उदाहरण के लिए, यदि आप एक गैर-आरंभिकृत संकेतक भिन्नता की कोशिश करते हैं, आप की संभावना की तरह कुछ मिल जाएगा।

enter image description here

+7

और एमएस ने भरने के मूल्य के रूप में '0xCC' क्यों चुना? क्योंकि x86 निर्देश सेट में '0xCC' एकल-बाइट ब्रेकपॉइंट निर्देश है। इस तरह, यदि आप गलती से अपूर्ण स्मृति निष्पादित करते हैं, तो यह तुरंत ब्रेकपॉइंट पर पहुंच जाएगा। –

+0

@Rob कि मुझे नहीं पता था। :) मुझे लगता है कि अब यह कम प्रासंगिकता है कि हमारे पास स्मृति सुरक्षा है? – Mysticial

+2

@ मिस्टिकियल: वास्तव में नहीं: यह केवल पृष्ठ स्तर पर काम करता है (एक संपूर्ण पृष्ठ निष्पादन योग्य के रूप में चिह्नित किया जा सकता है या नहीं, और केवल अगर सीपीयू, ओएस और प्रक्रिया सभी एनएक्स-बिट सक्षम करने के लिए सहमत हैं)। लेकिन क्या होगा यदि आप 2 केबी पेज से कोड के 40 बाइट्स का उपयोग करते हैं? पृष्ठ निष्पादन योग्य चिह्नित किया जाना चाहिए, जो शेष पृष्ठ निष्पादन योग्य छोड़ देता है, लेकिन कचरा युक्त :) – jalf

1

आप uninitialised स्मृति स्थान पर पहुंचते हैं, VC2010 हमेशा आपको चेतावनी देता है कि आप कुछ 0xcccccccc युक्त पते ऐक्सेस किया है,

0xcc (एक डीबग बिल्ड में) संकलक द्वारा प्रयोग किया जाता है मूल्य अनियमित स्मृति भरें।

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