在C中,最多有2个常见内存错误:
1.悬空指针:
您释放/使得一块内存无效,但没有将指针设置为NULL以便以后进行验证。
2.缓冲区溢出:
您写入和/或读取的数据超出了缓冲区限制。
有很多策略可以避免这两种内存错误。我将首先解决悬空指针:
![586763f3b306ad232203f65dce71890f.png](https://img-blog.csdnimg.cn/img_convert/586763f3b306ad232203f65dce71890f.png)
a是一个悬空指针,它指向有效内存,并且该有效内存已释放。下一步是什么?好吧,您将这个东西设置为NULL以便以后可以对其进行NULL检查,并防止意外读取和写入无效内存。
![e7bea2293ff38ec5e0eb47669ed7039f.png](https://img-blog.csdnimg.cn/img_convert/e7bea2293ff38ec5e0eb47669ed7039f.png)
悬空的指针并不是那么难处理,只要使用完它的内存,就再次将其设置为NULL即可。但是,另一个危险是如果您复制了原始指针的地址,并且在释放原始指针时不小心使用了该副本!那么您所想的剧情就会发生转折了!!
![0f58bf2c24523b58121e3dda2d17798c.png](https://img-blog.csdnimg.cn/img_convert/0f58bf2c24523b58121e3dda2d17798c.png)
像这样就出现了:a不再悬空,而b停止!!!
那么您如何避免这种情况?最好的策略是使用指向原始指针的指针:
![b5ed79f66864f2d272a7816f93f433e0.png](https://img-blog.csdnimg.cn/img_convert/b5ed79f66864f2d272a7816f93f433e0.png)
像这样就是a不是悬空的, b也不会悬空。
现在,处理缓冲区溢出已经很容易了,使用静态大小的缓冲区,编译器可以通过使用已知大小的缓冲区来帮助防止缓冲区溢出。
![557f3ab0fef3cac5d96d5eaa4ed86023.png](https://img-blog.csdnimg.cn/img_convert/557f3ab0fef3cac5d96d5eaa4ed86023.png)
不管缓冲区的静态大小是多少,用第一个地址减去缓冲区的上限都可以!一个类似的替代方法是直接使用数组的指针作为迭代器:
![8229775ac084f0b208a3c0274d715301.png](https://img-blog.csdnimg.cn/img_convert/8229775ac084f0b208a3c0274d715301.png)
请记住,这只能防止在静态大小的缓冲区上发生缓冲区溢出,仍然可能存在在动态大小的缓冲区上发生溢出的问题!
在防止动态大小的缓冲区溢出方面。您必须使用簿记变量来跟踪缓冲区的长度,并确保缓冲区的长度跟踪变量不会损坏:
![69fb1c7f001b40fd8c22eeba9c098471.png](https://img-blog.csdnimg.cn/img_convert/69fb1c7f001b40fd8c22eeba9c098471.png)
了解更多有关C/C++学习内容,免费领取学习资料,请看下方了解更多:
![b92bbda7dd6c51c3233ddb389cbbfb61.png](https://img-blog.csdnimg.cn/img_convert/b92bbda7dd6c51c3233ddb389cbbfb61.png)