2012-03-04 20 views
5

Moje kodu jest jak poniżej:C++ problem alokacji pamięci

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

biegnę to w VS2010, pamięć jest jak poniżej

enter image description here

Jestem ciekaw co cc w pamięci używane dla? Jak obliczana jest liczba cc?

Odpowiedz

7

Podczas kompilacji dla "Debugowanie" w Visual Studio, cc są często używane do wypełniania niezainicjowanej pamięci. W ten sposób staje się to bardziej oczywiste, gdy uzyskujesz dostęp do niezainicjowanej pamięci.

Na przykład, jeśli spróbujesz dereference z niezainicjowanych wskaźnik, będziesz prawdopodobnie uzyskać coś takiego:

Access Violation accessing 0xcccccccc 

czy coś takiego.

enter image description here

+7

I dlaczego MS wybrał "0xCC" jako wartość wypełnienia? Ponieważ '0xCC' jest pojedynczą bajtową instrukcją punktu przerwania w zbiorze instrukcji x86. W ten sposób, jeśli przypadkowo wykonasz niewypełnioną pamięć, natychmiast uderzy ona w punkt przerwania. –

+0

@Rob Nie wiedziałem. :) Przypuszczam, że teraz ma to mniejsze znaczenie teraz, gdy mamy ochronę pamięci? – Mysticial

+2

@Mysticial: not really: to działa tylko na poziomie strony (cała strona może być oznaczona jako wykonywalna lub nie, i tylko wtedy, gdy CPU, system operacyjny i proces wszystkie zgadzają się na włączenie bitów NX). Ale co, jeśli użyjesz 40 bajtów kodu ze strony 2KB? Strona musi być oznaczona jako wykonywalna, co pozostawia resztę strony do wykonania, ale zawiera śmieci :) – jalf

1

Po wejściu do zainicjalizowana pamięć, VC2010 zawsze ostrzegam cię, że masz dostęp do jakiś adres zawierający 0xcccccccc,

0xcc jest wartością używaną przez kompilator (w kompilacji debugowania) do zapełnij niezainicjowaną pamięć.

Powiązane problemy