2012-03-04 103 views
5

我的代碼如下所示:C++內存分配問題

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

我在VS2010運行這一點,記憶就像下面

enter image description here

我很好奇,在內存中的cc使用什麼對於?以及如何計算cc的數量?

回答

7

在Visual Studio中爲「調試」編譯時,cc經常用於填充未初始化的內存。這樣,訪問未初始化的內存時就更加明顯了。

例如,如果您嘗試取消引用未初始化的指針,你可能會得到這樣的:

Access Violation accessing 0xcccccccc 

或類似的東西。

enter image description here

+7

爲什麼MS選擇'0xCC'作爲填充值?因爲'0xCC'是x86指令集中的單字節斷點指令。這樣,如果你不小心執行了未填充的內存,它會立即觸發一個斷點。 – 2012-03-04 04:30:02

+0

@Rob我不知道。 :)我想現在我們有內存保護,這不太重要? – Mysticial 2012-03-04 04:31:43

+2

@Mysticial:並非如此:只適用於頁面級別(整個頁面可以標記爲可執行或不可執行,並且只有當CPU,操作系統和進程都同意啓用NX位時)。但是如果從2KB頁面中使用40字節的代碼呢?頁面必須標記爲可執行文件,這會使頁面的其餘部分可執行,但包含垃圾:) – jalf 2012-03-04 12:12:14

1

當您訪問未初始化的內存空間,VC2010會一直提醒你,你已經使用了一個包含0xcccccccc一些地址,

0xcc是由編譯器使用的(在調試版本)的值填滿未初始化的內存。