0xCCCCCCCCC的內存不能訪問的原因

在VC6下調試程序,可能會遇到諸如指令引用“0xcccccccc”,該內存不能爲Read的報錯

究其原因,就debug版中的堆棧中的局部變量(包括指針)在明確初始化之前都用0x0cc進行初始化,因此,未初始化時 候的指針是指向地址0x0cccccccc的,而這段地址一來是處於內核地址空間,一般的應用程序是無權訪問的,上面的報錯就是這樣產生的。因此,一旦遇 到上述報錯,基本可以認定程序中出現了野指針。

另外一方面cc對應着int 3調試中斷,堆棧中的存放的局部數據一般情況下是隻讀的,當發生意外執行堆棧裏面的數據就會引發該調試中斷。

可以認爲0x0cc就是有特殊含義的佔位符,對於指針而言,它跟NULL是一個意思,其它具有特殊意義的佔位符還有:

0xcdcdcdcd - Created but not initialized

0xdddddddd - Deleted

0xfeeefeee - Freed memory set by NT's heap manager

0xcccccccc - Uninitialized locals in VC6 when you compile w/ /GZ

0xabababab - Memory following a block allocated by LocalAlloc()

 

例如:

char   *str= "abc";
char   *str1 ;
char   *str2=strcpy(str1,str);

就會彈出0xc0000005 access violation的錯誤提示,因爲strcpy的內部會將str拷貝到str1所在的地址空間,而未初始化的str初始化爲0xcccccccc,這段地址處於內核地址空間,無權訪問,因此報錯

引申出來的問題:

 

char   *str= "abc";
char   *str1 ="sdfsd";
char   *str2=strcpy(str1,str);

也會彈出0xc0000005 access violation,這又是爲什麼呢

 

這就涉及到了常量存儲區的問題

C++ 中, 內存分成5 個區,他們分別是堆、棧、自由存儲區、全局/ 靜 態存儲區和常量存儲區。

棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變量的存儲區。裏面的變量通常是局部變量、函數參 數等。

堆,就是那些由new 分配的內存塊,他們的釋放編譯器不去 管,由我們的應用程序去控制,一般一個new 就要對應一個delete 。 如果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收。

自由存儲區,就是那些由malloc 等 分配的內存塊,他和堆是十分相似的,不過它是用free 來結束自己的生命的。

全局/ 靜 態存儲區,全局變量和靜態變量被分配到同一塊內存中,在以前的C 語言中,全局變量又分爲初始化的和 未初始化的,在C++ 裏面沒有這個區分了,他們共同佔用同一塊內存區。

常量存儲區,這是一塊比較特殊的存儲區,他們裏面存放的是常量, 不允許修改(當然,你要通過非正當手段也可以修改,而且方法很多)

正如黑線標記的說法 "sdfsd"以常量形式存於常量存儲區,這一段的內存也是不可更改的,因此當然彈出錯誤了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章