2012-03-04 3 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. Таким образом, если вы случайно выполняете незаполненную память, она мгновенно попадает в точку останова. –

+0

@Rob Что я не знал. :) Полагаю, теперь это менее актуально, когда у нас есть защита памяти? – Mysticial

+2

@Mysticial: не реально: это работает только на уровне страницы (вся страница может быть помечена как исполняемая или нет, и только если процессор, ОС и процесс согласны разрешить NX-бит). Но что, если вы используете 40 байт кода из 2KB-страницы? Страница должна быть отмечена как исполняемая, остальная часть исполняемой страницы, но содержащая мусор :) – jalf

1

При доступе к неиницализированному пространству памяти, VC2010 всегда предупредят вас, что вы получили доступ к некоторому адресу, содержащий 0xcccccccc,

0xcc значение используется компилятором (в отладочном) в заполните неинициализированную память.