Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c崩溃的程度有多严重?_C_Crash - Fatal编程技术网

c崩溃的程度有多严重?

c崩溃的程度有多严重?,c,crash,C,Crash,我经常听说C可以惊人地崩溃。最近,我第一次体验到这一点,当时我希望返回一个字符串的函数返回了一些小笑脸。从那以后,我在初始化指针和为数组分配内存时就更加小心了。尽管如此,我还是很难相信一个程序会崩溃得那么严重 我想这取决于项目的范围?我的意思是,如果一个处理你的粉丝的程序中有一个bug把笑脸复制到了内存中的某个重要空间 我的问题是,在壮观的C崩溃的世界里有多少神话?我能举一些应该避免的危险事物的具体例子吗 z、 我认为,在虚拟内存出现之前,可能会有更糟糕的情况,那时你可以将其他进程的内存丢弃,但

我经常听说C可以惊人地崩溃。最近,我第一次体验到这一点,当时我希望返回一个字符串的函数返回了一些小笑脸。从那以后,我在初始化指针和为数组分配内存时就更加小心了。尽管如此,我还是很难相信一个程序会崩溃得那么严重

我想这取决于项目的范围?我的意思是,如果一个处理你的粉丝的程序中有一个bug把笑脸复制到了内存中的某个重要空间

我的问题是,在壮观的C崩溃的世界里有多少神话?我能举一些应该避免的危险事物的具体例子吗


z、

我认为,在虚拟内存出现之前,可能会有更糟糕的情况,那时你可以将其他进程的内存丢弃,但现在最糟糕的情况是你自己的程序崩溃了。通常通过错误指针的分段错误


当然,这不包括滥用系统资源而导致的崩溃——你可以用任何语言来实现这一点。

发生在我身上最糟糕的事情是内存损坏,它没有立即导致崩溃,但过了一段时间。。让它很难被发现。。argh

好吧,如果你在写内核代码,有时你可以覆盖系统关键内存位,比如中断向量、全局描述符表、进程表,引起各种有趣的事情


如果您的代码运行在远程现代操作系统上,则无法将笑脸复制到内存中的随机点。您可以随意崩溃,这只会导致进程终止


最接近于真正弄乱系统的是滥用处理器/内存/磁盘资源,或者产生太多子进程,导致操作系统没有PID(如果它仍然使用32位值来存储这些PID)。

现在是一种硬性的做法,使C崩溃成为硬性的(除非您正在编写操作系统内核或类似的代码)

回到DOS/Win95/Win98时代,你可能会把C程序弄得非常非常糟糕。我以前经常遇到这样的情况:

每当我有一个危险的指针操作,它扰乱了内存,我就会看到一个基于字符的屏幕,满是各种不同颜色的字符,其中一些闪烁着!!!我想这些操作在某种程度上扰乱了视频内存


但是今天,由于进程在安全的内核中运行,如果进程离开,最糟糕的情况是。

C本身不会崩溃任何东西。草率的编程可能会崩溃所有东西


“笑脸”表明你的代码破坏了内存。C唯一能做的就是你选择使用它。(而且你的操作系统允许它发生的事实令人惊讶——你还在运行DOS版本吗?)当我在学习C++程序时,是在一个MAC运行系统7或8上,我记不起哪一个。无论如何,它没有保护的虚拟内存,所以很多错误,比如说悬空指针或缓冲区溢出会导致整个计算机崩溃。我记得苹果首次宣布他们将创建一个新的操作系统。在Macworld或其他地方保护了内存空间,他们展示了一个程序的源代码:

while (true)
  *(int *)i++ = 1;
当他们运行程序时,只是程序终止了,而不是整个机器终止了(它有一条信息,如“您不需要重新启动计算机”)整个房间里挤满了开发人员,大家都热烈鼓掌。显然,没有保护内存,确实使编程C或C++变得非常困难,因为崩溃的严重程度增加了。
如今,这并不是什么大不了的事,除非你正在编写某种在主管级别运行的程序,否则你就没有能力使操作系统崩溃。

有一台计算机,Commodore PET 4032(又名“胖40”)如果你将错误的值插入错误的内存部分,视频芯片实际上可能永久烧坏。你可以想象,如果那台机器上有C编译器,一个疯狂的指针实际上会对计算机造成无法修复的物理损坏。

如今,操作系统防止了最可怕的问题。我所做过的最糟糕的事情就是硬锁机器(只需按下电源按钮重启),并扰乱一些文件

实际上,这一切都取决于您正在访问的资源。如果您正在写入文件,目录结构可能会有一些混乱的方式,这些方式通常会混淆系统实用程序,但大多数问题都已得到解决。如果您正在以根用户身份进行操作,那么您肯定会造成混乱,因为更多的系统文件是可写的。如果您在使用网络时,有很多东西可能会出一些小问题,但可能只会占用太多带宽。当然,经过几年的编程,你会看到各种不太可能发生的事情

不过,在大多数情况下,进行试验和玩转是可以的。现在的系统具有足够的弹性,不会造成难以恢复的混乱。操作系统将每个程序保留在自己的内存中,并且除非您是管理员/根用户,否则不允许访问更改关键系统。您的花园品种d钓鱼指针可能会打印有趣的东西或使你的程序崩溃,但它不会破坏现代计算机

另一封回复中的评论:“我正在使用任天堂DS运行它们”

好的,这很重要!(第一:好主意!听起来很有趣。)就出错的地方而言,为类似的东西编写代码与为台式计算机编写的大多数代码是不同的。简单看一下libnds的文档和一些任天堂DS编程的教程,我就知道没有操作系统可言。因此,我不知道你能用一个错误的指针做多少事情,可能很多。
    int nSomeVar;
    int nSomeMore;
    ...