当前位置:首页 > 操作系统 > Linux

Linux平台下变量在栈帧中的存储

局部变量的存储位置是在栈中,栈在内存中的特点是自上而下生长,也就是由高地址到低地址,当变量作为函数参数传递时为传值方式,函数形参作为接收方会开辟一块临时空间来拷贝实参的值,如下代码:

技术分享650) this.width=650;" src="/upload/getfiles/default/2022/11/11/20221111122052281.jpg" title="QQ图片20160401152350.png" />


当main函数中调用函数stack_test时,将局部变量a,b传值过去,此时调试可得到a,b的存储位置

技术分享650) this.width=650;" src="/upload/getfiles/default/2022/11/11/20221111122052596.jpg" title="QQ图片20160401152435.png" />

而后进入函数stack_test后,临时开辟了另一块空间来拷贝a,b的值,调试可得出

技术分享650) this.width=650;" src="/upload/getfiles/default/2022/11/11/20221111122052799.jpg" title="QQ图片20160401152422.png" />

因此,形参和实参并不是同一回事,只是值相同而已,此时输出b,值应该为0xbbbb,而之后将a的地址赋给临时指针变量p,再将p进行自加,调试可得

技术分享650) this.width=650;" src="/upload/getfiles/default/2022/11/11/20221111122052983.jpg" title="QQ图片20160401152444.png" />

因此将0xdddd赋值给指针p所指向的空间,就是将函数struct_test中的b值更改为0xdddd,但是main函数中的b值并没有改变,此时输出b值为0xdddd。


下面的程序:

技术分享650) this.width=650;" src="/upload/getfiles/default/2022/11/11/20221111122053228.jpg" title="QQ图片20160401152407.png" />

运行程序会出现重启系统,因为函数bug中用了system("reboot");system函数会调用fork去创建一个子进程,函数stack_test中,调试可得

技术分享650) this.width=650;" src="/upload/getfiles/default/2022/11/11/20221111122053508.jpg" title="QQ图片20160401201941.png" />

技术分享650) this.width=650;" src="/upload/getfiles/default/2022/11/11/20221111122053896.jpg" title="QQ图片20160401201947.png" />

将函数bug的入口赋值给了指针变量p,

技术分享650) this.width=650;" src="/upload/getfiles/default/2022/11/11/20221111122054139.jpg" title="QQ图片20160401202242.png" />

0x8048414转换成十进制就为*p所指向空间的值134513684,也就是将偏移量0x8048414赋给*p

当stack_test函数结束时会去调用bug函数

技术分享650) this.width=650;" src="/upload/getfiles/default/2022/11/11/20221111122054315.jpg" title="QQ图片20160401202525.png" />

本文出自 “敲完代码好睡觉zzz” 博客,请务必保留此出处http://2627lounuo.blog.51cto.com/10696599/1759362

原文:http://2627lounuo.blog.51cto.com/10696599/1759362


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐