我经常听说C会崩溃.最近,当我希望返回一个字符串的函数返回一些快乐的面孔时,我第一次尝到了这个.从那时起,我一直在更加小心地初始化指针和为数组mallocing内存.尽管如此,我仍然很难相信一个程序可能会严重崩溃......
我想这取决于该计划的范围?我的意思是,如果一个处理你的粉丝的程序中的一个错误将幸福的面孔复制到记忆中的一些重要空间......?
我的问题是,在壮观的C崩溃世界中有多少神话?我可以得到一些应该避免的危险事物的具体例子吗?
ž.
http://xkcd.com/371/
http://blog.raamdev.com/category/technology/programming/cc
http://en.wikipedia.org/wiki/Segmentation_fault
我认为可能更糟糕的是,在虚拟内存前几天你可能会丢弃其他进程内存,但现在最糟糕的情况就是崩溃你自己的程序.通常通过坏指针的分段错误.
这当然不包括滥用系统资源 - 你可以用任何语言做到这一点.
回到我学习编程C++时,它是在运行系统7或8的Mac上我不记得哪个.无论如何,它没有受保护的虚拟内存,所以很多错误,如留下悬空指针或缓冲区溢出会导致整个计算机崩溃.我记得当Apple首次宣布他们要创建一个在Macworld上保护内存空间的新操作系统时,他们展示了一个程序的源代码:
while (true) *(int *)i++ = 1;
当他们运行程序并且只是程序终止时,而不是整个机器(它有一条消息,如"你不需要重新启动计算机"),整个房间里充满了开发人员,他们突然爆发出热烈的掌声.无论如何,显然没有受保护的内存真的使编程C或C++真的很难,因为崩溃的严重性增加.
如今,除非你编写一些在管理员级别运行的东西,否则它就没那么大了,你没有能力使操作系统崩溃.
发生在我身上的最糟糕的事情是内存损坏,它不会立即引起崩溃,但过了一段时间......让它很难被发现.. argh
如今,操作系统可以防止最棘手的问题.我做过的最糟糕的事情是硬锁机器(只需按住电源按钮重新启动)并加扰一些文件.
一切都取决于您正在访问的资源.如果您正在编写文件,那么目录结构可能会混淆一些用于混淆系统实用程序的方法,但大多数问题已得到修复.如果你正在以root身份做某事,那么你可以肯定弄得一团糟,因为更多的系统文件是可写的.如果您正在使用网络,那么有很多东西可能会出现中等错误,但可能只是占用太多带宽.当然,几年的编程,你会看到各种不太可能的事情.
但在大多数情况下,可以试验和玩耍.这些天系统具有足够的弹性,你不会弄得太乱,太难以退出.操作系统将每个程序保留在自己的内存中,并禁止访问更改关键系统,除非您是管理员/ root用户.你的花园种类悬垂的指针可能会打印有趣的东西或崩溃您的程序,但它不会破坏现代计算机.
来自另一个回复中的评论:"我正在使用Nintendo DS来运行它们"
好的,重要的! (第一:非常棒的想法!听起来很有趣.)对于像桌面计算机的大多数编码一样,对于类似的东西进行编码是不一样的.简要介绍一下libnds的文档和一些关于Nintendo DS编程的教程,向我表明没有操作系统可以说.所以,我不知道你可以用一个迷路指针做多少,可能很多.可能是有害的东西.寻找之前为该平台编程的人可能是一个好主意,看看他们要说些什么.
以下是Henry Spencer的"C程序员十诫"的快速片段:
诫命#2 - 你不应该遵循NULL指针,因为混乱和疯狂等待你的结束.
显然,圣经在这里被错误转录,因为这些词应该是"空指针",以最大限度地减少空指针概念和宏NULL(其中更多的那个)之间的混淆.否则,意思很明显.空指针指向充满龙,恶魔,核心转储和无数其他污秽生物的区域,如果你打扰他们的睡眠,所有这些都会让你喜欢在程序中嬉戏.空指针并不指向任何类型的0,尽管有些亵渎神灵的旧代码无意中假设了这一点.
对于那些不熟悉C的人,我认为对C的最佳书面简明介绍是由Henry Spencer 撰写的" C程序员十大诫命(注释版) "完成的.它的编写方式确实让读者了解了C的危险......同时又很有趣(这意味着读者实际上会更加注意).
=========================
个人... 当你进行桌面开发时,C不会崩溃,因为你有奢侈的seg-faulting.Seg-fault是当操作系统看到你试图真正把事情搞砸了,它说"嘿!你不被允许在那里"并停止这个过程.
当你进行嵌入式C开发时...就是当你得到真正令人叹为观止的疯狂东西时...即他们要求你在99.9%的时间内循环上电.就像这一次,代码以某种方式混淆了我的调用堆栈...然后你正在执行一些随机的其他函数......然后ISR不知何故仍在继续......并且需要2周才能修复那种bug .
好吧,如果您正在编写内核代码,有时您可以覆盖系统关键的内存位,例如中断向量,全局描述符表,进程表,从而导致各种有趣的东西!
C本身不会崩溃任何东西.邋programming的编程可能会崩溃一切.
"快乐的面孔"表示您的代码损坏了内存.C与此有关的唯一事情就是你选择使用它.(而且你的操作系统允许它发生的事实是令人惊讶的 - 你还在运行DOS版本吗?)