¿Por qué la inicialización de una cadena en una función no funciona como int durante la depuración?

Así que intenté depurar algunos progtwigs simples de C hoy;

El primer ser

int main(){ int a ,b ; return 0 ; } 

Que cuando de-comstackdo me dio

  push ebp mov ebp,esp sub esp,008h 

¡porque necesito tener 8 bytes para almacenar ayb en el marco de stack actual ya que son variables locales!

Pero cuando bash lo mismo con cuerdas dicen

 int main() { char greeting[12] = "Pwnit2Ownit"; return 0; } 

Que cuando de-comstackdo me dio

  push ebp mov ebp,esp sub esp,0DCh 

0DCh es 220, pero como la cadena solo tiene 12 bytes, no debería

sub esp, 0DCh

ser

sub esp, 00ch

en cambio?

Y alguien puede compartir algunos enlaces sobre cómo se almacenan las cadenas en la memoria y se accede más tarde a través del ensamblaje [preferiblemente instrucciones], como los saludos de la cadena almacenados en la memoria si la longitud es grande ya que no podemos almacenar todos en la stack

Como @ user3386109 señaló, el problema es evitar el desbordamiento, la verificación de seguridad predeterminada en Visual Studio está habilitada y proporciona espacio adicional para evitar desbordamientos, por lo que al desactivarla, el comstackdor asignó solo 12 bytes: D

Para desactivar esta medida de seguridad (Buffer Security Checks GS), desactive la configuración del proyecto -> C / C ++ -> Generación de código -> control de seguridad = deshabilitar GS

Algunos post relacionados con GS

http://preshing.com/20110807/the-cost-of-buffer-security-checks-in-visual-c/