gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:36:02 25 4
gpt4 key购买 nike

所以我今天尝试调试一些简单的 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

一些与GS相关的帖子

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

关于c - 为什么在调试时在函数中初始化字符串不像 int 那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37309076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com