怪我咯2017-04-17 13:06:59
兩方面吧,從語言看,C語言不自帶記憶體管理機制,而Java、C#、js等語言自帶了記憶體管理機制。記憶體管理就是容比較易出問題的一個地方,對程式設計師要求很高。
從運行時看,大部分C語言編譯之後直接跑在硬件,語任何錯誤都直接反應到硬體上;而與之相對的解釋型語言或者編譯後跑在虛擬機上的語言,解釋器或虛擬機器本身在執行過程中會做很多檢查,盡可能的避免奔潰。
巴扎黑2017-04-17 13:06:59
應該是程式設計時就有漏洞,從而在運行上反映了程式碼設計的漏洞。
C語言需要全面掌握編譯器特性以及相關電腦底層知識
另外一方面就是多看看大牛們的程式碼,多調試。多多熟悉編譯器,多使用成熟的監測工具
阿神2017-04-17 13:06:59
大部分語言都有類似的問題,只是換了個名字而已
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…
大家讲道理2017-04-17 13:06:59
這種用一部分的說法,就是「直譯成彙編」的程式語言,除了具備現代編譯語言的基本形態,其實還是走得比較底層的開發路線吧,加上因為允許程式設計師任意使用指針,編譯器也不敢管太多。所以對開發者本身的素質要求就高了很多,對於像我這種只學過js的人,c語言根本就是什麼都在自己管理…
阿神2017-04-17 13:06:59
主要問題是用C語言時,記憶體由程式設計師自己管理,記憶體管理不好,就掛了。
典型:
空指標訪問,導致程式掛掉。
野指針訪問,例如某指針指向的內容已經失效,再去訪問該不可控指針,導致程式掛掉。
記憶體越界訪問,即通常所說的“記憶體被踩了”,例如數組越界寫內存,修改了未知資料區。這種操作極度危險和隱蔽,通常很難定位。
C語言把很多事情交由程式設計師自己管理,在提高靈活性和效能的基礎上也存在穩定性方面的風險。這是一把雙面刃,提升自己的水平才能游刃有餘,否則可能適得其反。
迷茫2017-04-17 13:06:59
其實真正的原因是人的原因。
很多語言,譬如C#和Java,有一個設計良好的異常處理系統。很多程式設計師,寧可冒著資料出錯的風險,也不想程式掛掉,於是做什麼都catch一下,把不認識的exception隨便找個地方log一下就忽略了。
然而C語言卻沒有這樣省事的做法,雖然同樣程式都寫得很差,但是在C語言這邊就表現的容易掛。