84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
小伙看你根骨奇佳,潜力无限,来学PHP伐。
两方面吧,从语言看,C语言不自带内存管理机制,而Java、C#、js等语言自带了内存管理机制。内存管理就是容比较易出问题的一个地方,对程序员要求很高。从运行时看,大部分C语言编译之后直接跑在硬件,语任何错误都直接反应到硬件上;而与之相对的解释型语言或者编译后跑在虚拟机上的语言,解释器或虚拟机本身在执行过程中会做很多检查,尽可能的避免奔溃。
应该是在程序设计时就有漏洞,从而在运行上反映了代码设计的漏洞。C语言需要全面掌握编译器特性以及相关计算机底层知识
另外一方面就是多看看大牛们的代码,多调试。多多熟悉编译器,多使用成熟的监测工具
纠正个拼写错误core dump
大部分语言都有类似的问题,只是换了个名字而已C的版本叫做segmentation fault(看看这网站的名字)C++也是segmentation fault,也有各种exceptionJava的叫做NullPointerException和ArrayOutOfIndex动态语言里变成了NoMethodError或者No attribute或者undefined is not a function之类,本质上还是NullPointerException
当然,C和C++比较容易出现这种问题因为C和C++需要手动释放内存,做错了(释放错位置/释放后又用了/释放后以为没释放,结果别人拿来重用时又释放了,etc)就会segmentation faultJava等有了GC,内存尽管用,不用释放,于是没了这些问题然而程序员的粗心是无限的,于是你还是会遇到NullPointerException和ArrayOutOfIndex……
程序设计时谁都不想让它出问题c语言 太多的内存操作 太容易越界没有一定经验 很难写出优秀的代码~
这种用一部分的说法,就是「直译成汇编」的编程语言,除了具备现代编译语言的基本形态,其实还是走得比较底层的开发路线吧,加上因为允许程序员任意使用指针,编译器也不敢管太多。所以对开发人员自身的素质要求就高了很多,对于像我这种只学过js的人,c语言根本就是什么都在自己管理……
开发者水平问题linux/unix这不都还算稳定吗
主要问题是用C语言时,内存由程序员自己管理,内存管理不好,就挂了。典型:
空指针访问,导致程序挂掉。
野指针访问,例如某指针指向的内容已经失效,再去访问该不可控指针,导致程序挂掉。
内存越界访问,即通常所说的“内存被踩了”,比如数组越界写内存,修改了未知数据区。这种操作极其危险和隐蔽,通常很难定位。C语言把很多事情交由程序员自己管理,在提高灵活性和性能的基础上也存在稳定性方面的风险。这是一把双刃剑,提升自己的水平才能游刃有余,否则可能适得其反。
其实真正的原因是人的原因。
很多语言,譬如C#和Java,有一个设计良好的异常处理系统。很多程序员,宁可冒着数据出错的风险,也不想程序挂掉,于是干什么都catch一下,把不认识的exception随便找个地方log一下就忽略了。
然而C语言却没有这样省事的做法,虽然同样程序都写得很差,但是在C语言这边就表现的容易挂。
两方面吧,从语言看,C语言不自带内存管理机制,而Java、C#、js等语言自带了内存管理机制。内存管理就是容比较易出问题的一个地方,对程序员要求很高。
从运行时看,大部分C语言编译之后直接跑在硬件,语任何错误都直接反应到硬件上;而与之相对的解释型语言或者编译后跑在虚拟机上的语言,解释器或虚拟机本身在执行过程中会做很多检查,尽可能的避免奔溃。
应该是在程序设计时就有漏洞,从而在运行上反映了代码设计的漏洞。
C语言需要全面掌握编译器特性以及相关计算机底层知识
另外一方面就是多看看大牛们的代码,多调试。多多熟悉编译器,多使用成熟的监测工具
纠正个拼写错误core dump
大部分语言都有类似的问题,只是换了个名字而已
C的版本叫做segmentation fault(看看这网站的名字)
C++也是segmentation fault,也有各种exception
Java的叫做NullPointerException和ArrayOutOfIndex
动态语言里变成了NoMethodError或者No attribute或者undefined is not a function之类,本质上还是NullPointerException
当然,C和C++比较容易出现这种问题
因为C和C++需要手动释放内存,做错了(释放错位置/释放后又用了/释放后以为没释放,结果别人拿来重用时又释放了,etc)就会segmentation fault
Java等有了GC,内存尽管用,不用释放,于是没了这些问题
然而程序员的粗心是无限的,于是你还是会遇到NullPointerException和ArrayOutOfIndex……
程序设计时谁都不想让它出问题
c语言 太多的内存操作 太容易越界
没有一定经验 很难写出优秀的代码~
这种用一部分的说法,就是「直译成汇编」的编程语言,除了具备现代编译语言的基本形态,其实还是走得比较底层的开发路线吧,加上因为允许程序员任意使用指针,编译器也不敢管太多。所以对开发人员自身的素质要求就高了很多,对于像我这种只学过js的人,c语言根本就是什么都在自己管理……
开发者水平问题
linux/unix这不都还算稳定吗
主要问题是用C语言时,内存由程序员自己管理,内存管理不好,就挂了。
典型:
空指针访问,导致程序挂掉。
野指针访问,例如某指针指向的内容已经失效,再去访问该不可控指针,导致程序挂掉。
内存越界访问,即通常所说的“内存被踩了”,比如数组越界写内存,修改了未知数据区。这种操作极其危险和隐蔽,通常很难定位。
C语言把很多事情交由程序员自己管理,在提高灵活性和性能的基础上也存在稳定性方面的风险。这是一把双刃剑,提升自己的水平才能游刃有余,否则可能适得其反。
其实真正的原因是人的原因。
很多语言,譬如C#和Java,有一个设计良好的异常处理系统。很多程序员,宁可冒着数据出错的风险,也不想程序挂掉,于是干什么都catch一下,把不认识的exception随便找个地方log一下就忽略了。
然而C语言却没有这样省事的做法,虽然同样程序都写得很差,但是在C语言这边就表现的容易挂。