2012-03-04 17 views
5

Mi código es como abajo:C++ problema de asignación de memoria

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

corro esto en VS2010, la memoria es como a continuación

enter image description here

Tengo curiosidad por lo que el cc en la memoria utilizada ¿para? ¿Y cómo se calcula el número de cc?

Respuesta

7

Cuando se compila para "Depurar" en Visual Studio, los cc se usan a menudo para llenar la memoria no inicializada. De esta forma, es más obvio cuando accede a la memoria no inicializada.

Por ejemplo, si intenta eliminar la referencia de un puntero no inicializado, es probable que consigue algo como:

Access Violation accessing 0xcccccccc 

o algo por el estilo.

enter image description here

+7

¿Y por qué MS eligió '0xCC' como el valor de relleno? Porque '0xCC' es la instrucción de punto de interrupción de un solo byte en el conjunto de instrucciones x86. De esta forma, si accidentalmente ejecuta la memoria no cargada, alcanzará un punto de interrupción instantáneamente. –

+0

@Rob Eso no lo sabía. :) Supongo que es de menor relevancia ahora que tenemos protección de memoria? – Mysticial

+2

@Mysticial: no realmente: eso solo funciona en un nivel de página (una página entera puede marcarse como ejecutable o no, y solo si la CPU, el sistema operativo y el proceso aceptan habilitar el NX-bit). ¿Pero qué pasa si usa 40 bytes de código de una página de 2KB? La página debe estar marcada como ejecutable, lo que deja el resto de la página ejecutable, pero conteniendo basura :) – jalf

1

Al acceder al espacio de memoria sin inicializar, VC2010 siempre le advierten de haber accedido a alguna dirección que contiene 0xcccccccc,

0xcc es el valor utilizado por el compilador (en una versión de depuración) para llene la memoria no inicializada.