C语言内存:我家大门常打开
C语言本着自由开放的理念,并不禁止程序访问非法内存。
什么是非法内存?就是那本不是你家的地,你却硬跑过去种庄稼。
或者,你在澡堂子里拿着自己的钥匙去捅别人的柜。
这种行为当然后果难料。
可能你捅了半天,火花冒出三丈多高,硬是捅不开。
也许正干得起劲,冷不防一个大汉把你揪出来不由分说对你施展一通“面目全非脚”。
也有可能你的运气非常好,一下子就打开了,然后惊获稀世之宝:一条金丝眼镜……蛇。
官方最新公告,非法内存访问可能会导致程序崩溃、数据损坏或安全漏洞,请广大市民注意。
C语言中常见的非法内存访问形式如下:
1.数组越界
最常见的非法内存访问就是数组越界。数组越界指访问数组元素时下标超出了数组的有效范围。比如你定义了一个含有10个元素的数组为a[10],你却硬要去访问a[9527],或者你不听劝阻地要去访问a[-2]家串门。
老弟呀,手伸得太长可是要付出代价的!
你可能会辩解说哥才没这么傻,但当你使用循环遍历数组时就会发现这不是杞人忧天了,多迈一两脚是常有的事。
2.野指针
这也是非常典型的问题。咱们之前讲过,野指针是指未初始化或已释放的指针。未初始化的指针就像失灵的指南针,可能指向任意位置,包括受保护的内存区域或未分配的内存。已释放的指针所指向的内存可能被存入任何东西,就像从垃圾箱里翻出的塑料袋,里面指不定会有什么惊喜。据大人们说,使用野指针可能会导致程序崩溃或数据损坏,因此小孩子千万不要尝试。
3.栈溢出
过度使用栈内存(例如,在函数中声明过大的局部数组)可能导致栈溢出,从而覆盖栈上的其他数据,包括返回地址和函数参数。就像是你吃自助餐时吃得太撑,一不小心把人家店里的桌子拱翻了。
4.堆损坏
不正确地管理堆内存(例如,使用malloc()分配内存后忘记free(),或者对malloc()返回的指针进行错误的算术运算)可能导致堆损坏。
5.类型错误
将指针类型错误地转换为其他类型,并尝试通过该指针访问内存。这可能导致对齐问题或访问权限错误。
上面这些好像不太响应群众路线,其实非法内存访问就在我们身边,比如游戏的外挂就是典型的非法内存访问,它专门访问、修改人家游戏程序里的数据。