为什么在调试时初始化函数中的字符串不像int那样工作

所以我今天尝试调试一些简单的C程序;

第一个是

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

在解编的时候给了我什么

  push ebp mov ebp,esp sub esp,008h 

因为我需要有8个字节来存储当前堆栈帧中的a和b,因为它们是局部变量!

但是当我尝试同样的字符串说

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

在解编的时候给了我什么

  push ebp mov ebp,esp sub esp,0DCh 

0DCh是220,但由于字符串只有12个字节长不应该

sub esp,0DCh

sub esp,00ch

相反?

任何人都可以分享关于如何将字符串存储在内存中以及稍后通过汇编[优先指令]访问的链接,如果它的长度很大,那么存储在内存中的字符串问候因为我们无法将所有内容存储在堆栈中

正如@ user3386109指出的那样,问题是防止溢出,启用Visual Studio中的默认安全检查,并且它提供额外的空间以防止溢出,因此将其关闭,使编译器仅分配12个字节:D

将此安全措施(缓冲区安全检查GS)关闭项目设置 – > C / C ++ – >代码生成 – >安全检查=禁用GS

一些post与GS有关

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