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

C 为什么初始化函数中的字符串不';调试时不能像int那样工作,c,debugging,visual-c++,assembly,reverse-engineering,C,Debugging,Visual C++,Assembly,Reverse Engineering,所以我今天试着调试一些简单的C程序 第一个是 int main(){ int a ,b ; return 0 ; } 当反编译给我的时候 push ebp mov ebp,esp sub esp,008h push ebp mov ebp,esp sub esp,0DCh 因为我需要有8个字节来存储当前堆栈帧中的a和b,因为它们是局部变量 但当我尝试

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

第一个是

int main(){

 int a ,b ;
 return 0 ;

}
当反编译给我的时候

  push        ebp  
  mov         ebp,esp  
  sub         esp,008h 
 push        ebp  
  mov         ebp,esp  
  sub         esp,0DCh 
因为我需要有8个字节来存储当前堆栈帧中的a和b,因为它们是局部变量

但当我尝试用同样的字符串时,我会说

int main() {

    char greeting[12] = "Pwnit2Ownit";
    return 0;
}
当反编译给我的时候

  push        ebp  
  mov         ebp,esp  
  sub         esp,008h 
 push        ebp  
  mov         ebp,esp  
  sub         esp,0DCh 
0DCh是220, 但是既然字符串只有12字节长,那么

副esp,0DCh

副esp,00ch

相反


任何人都可以分享一些关于字符串如何存储在内存中以及以后如何通过汇编[首选指令]访问的链接,比如如果字符串的长度很大,那么字符串如何存储在内存中,因为我们不能像@user3386109所指出的那样将其全部存储在堆栈中,问题是要防止溢出visual studio中的默认安全检查已启用,并且它提供了额外的空间以防止溢出,因此关闭它会使编译器只分配12个字节:D

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

一些与GS有关的帖子


@JoseManuelAbarcaRodríguez这里是关于C的,不确定链接的问题是否有帮助……编译器正在防御。它为您的字符串分配了额外的208个字节,这样当您溢出缓冲区时,它就不会造成任何实际损坏。我觉得有一个编译器选项可以关闭该功能。在这里快速搜索
[c]stack guard
的结果就是如此。如果你没有定义任何东西呢?这个堆栈分配还会存在吗?也许你没有看到正确的东西……是的,即使我们没有char var='a';相反,我们只有char-var;副esp,0cch;对于声明和非声明,请注意,如果您编写了
const char*greeting=“a string literal”,字符串文本将存储在可执行文件的只读部分,函数将只在堆栈上存储指向它的指针。除非您需要修改字符串,否则只需使用指向它们的指针,而不是数组。