
当n为9且应该正确运行时,没有什么可说的. 我相信每个人都对此表示反对. 当n等于99时,它可以正常运行. 我相信很都无法弄清楚. 我们申请的空间只有16个字节,为什么我们仍然可以访问第99个字节的空间(这就是所谓的堆溢出访问)?此时,堆实际上已经溢出,但是为什么结果没有错误?原因在于操作系统的内存分配策略. 例如,Linux中的内存由页面(页面,通常为每页4K字节)管理,并且操作系统以页面为单位向进程分配内存. 换句话说,尽管您只请求了16个字节,但实际分配给您的页面可能是一页(4K字节). 此页面上只有这16个字节是您自己的“合法属性”,并且您不应访问其他部分(访问后,堆将越过边界). 但是,由于操作系统对内存的访问权限管理是基于页面的,因此当您(非法)访问此页面上16个字节以外的内存时,系统不会报告错误,并且确实可以达到目的(在例如,n等于在99时读写仍然正确. )

这是否意味着跨越边界是无害的,所以根本不用担心吗?显然不是. 因为交叉的最大危害不是对自己,而是对“他人”. 因为除了请求的16个字节,并提防堆访问超出范围.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-297347-1.html
有操守
第二次撞击