c - 指针的危险

标签 c pointers

我正在尝试学习 C。因为我已经对高级语言(PHP、Javascript、Python)有一定的了解,所以我觉得我要做的大部分工作都涉及学习如何替换我认为理所当然的结构(比如可变大小的数组)通过使用指针和手动管理内存。我的问题是我有点担心玩指针。

通常我会尝试使用其他语言特性,但我的问题是指针使用不当可能会产生意想不到的结果。特别是:是否有可能 - 如果我犯了一个错误 - 我可能会破坏其他程序正在使用的内存段,从而导致这些程序运行异常?或者操作系统(在我的例子中是各种版本的 Ubuntu)会阻止我干扰分配给不同进程的内存吗?

在前一种情况下,我想我可能(虽然不太可能)导致其他程序在磁盘上写入错误数据,从而破坏我在硬盘驱动器上的一些信息。甚至最坏的情况(我想更不可能)它可能会损坏某些硬件 - 例如,较旧的显示器可能会被设置超出范围刷新率的软件烧毁。

我知道我的担心可能没有道理,但我想知道当我在管理指针时出错时,编译器/操作系统会在多大程度上阻止我进行危险操作。

最佳答案

In particular: is it possible - if I make a mistake - that I may corrupt memory segments that other programs are using, causing those programs to misbehave?

目前大多数(全部?)主要操作系统都没有。十年来,内存保护一直是大多数 Unix/Linux 系统、Windows 和 Mac OS 的一个特性。内存保护是一种操作系统级别的访问控制系统,可防止程序写入不属于它们的内存。正如您所建议的,这既是为了防止软件写入属于其他进程的内存,也是为了防止软件读取不属于它的内存(主要的安全风险)。

这并不是说您将来可能不必担心它,但如果您开始在现代桌面上学习 C,那么您真的不应该考虑它。如果您在 C 代码中犯了错误,您可能不会削弱操作系统! :)

这是一个非常有趣的话题,我认为每个人都会从中受益。当您尝试访问不属于您的内存并且您的进程被系统终止时,您几乎肯定会遇到这样的情况。查看这两篇 wiki 文章以获取更多信息:

http://en.wikipedia.org/wiki/Buffer_overflowhttp://en.wikipedia.org/wiki/Memory_protection

关于c - 指针的危险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4705550/

相关文章:

c - 编写一个函数,在 C 的一行中计算一个范围内的平方和

c - 将值设置为数组(初始化后)

针对写入优化的并发数据结构

c - 我不明白这一行,marks_count[total_marks[i]]++;请任何人描述一下

c - C代码的不合逻辑输出

c - 将代码从 32 位更改为 64 位后,将指针从 Microsoft Visual C++ 传递到 Fortran 并返回

C++:如何防止破坏参数中构造的对象?

计算C中字符串标记的数量

c++ - 我什么时候应该传递 "T* const&"类型的指针?

c++ - 如何处理模板类中的指针?