- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试学习 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_overflow和 http://en.wikipedia.org/wiki/Memory_protection
关于c - 指针的危险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4705550/
编辑:澄清一下,我明白为什么这段代码不起作用,我并不是要修复它,而是想了解如果这段代码可以在没有语义错误的情况下编译会有什么危险。 我发现下面的代码会导致静态语义错误。我知道这是因为 std::lis
我想知道 C# 枚举以及重复值会发生什么。我创建了以下小程序来测试: namespace ConsoleTest { enum TestEnum { FirstElem
正如我在另一个 SO 问题中指出的那样,我遇到了 this article .当我通过 MSVC7.1 编译 boost 1.40 时出现了这个问题,并且弹出了几个 C4251 警告。 现在,在阅读上
我有以下弹出窗口代码(客户端请求)。它使用 eval ,我知道这是危险的。有没有办法重写下面的脚本,使其不使用 (eval)? /* exported popup_default , popup_he
NTFS 文件可以有对象 ID。可以使用 FSCTL_SET_OBJECT_ID 设置这些 ID .然而,msdn article说: Modifying an object identifier c
我一直在学习命令行参数解析。关于这个已经有很长的线索了,我不想在这里挑起一个: Using getopts in bash shell script to get long and short com
这个问题在这里已经有了答案: How to configure ContextMenu buttons for delete and disabled in SwiftUI? (4 个回答) 4 个月
为什么在 linux 的中断处理程序中禁止 printk 或 (I/O)。?在什么情况下中断处理程序中的 I/O 会导致 linux 系统中的死锁? 最佳答案 关于 printk(),它是侵入性的。例
不是 Invoking virtual function and pure-virtual function from a constructor 的重复项: 以前的问题与 C++ 03 相关,而不是
我正在使用 lateinit 属性以避免使用 ?运算符(operator)。我有很多 View 属性是第一次在 getViews() 函数中分配的。如果该功能不存在,我的应用程序将与来自 Kotlin
我最近在使用 fputs 时遇到了问题:当使用 fputs 在文本文件中打印一些字符串时,我碰巧得到了除 A-Z、a-z、0-9 之外的其他字符(不属于字符串的字符) .我绝对确保所有字符串都以空字符
在仅包含字节数组的结构上使用 #pragma pack(1) 是否危险/有风险?例如。这个: #pragma pack(1) struct RpcMessage { uint8_t proto
我是一名优秀的程序员,十分优秀!