首頁  >  問答  >  主體

c++ - 为什么写c语言很容易core down?

伊谢尔伦伊谢尔伦2764 天前1023

全部回覆(9)我來回復

  • 怪我咯

    怪我咯2017-04-17 13:06:59

    兩方面吧,從語言看,C語言不自帶記憶體管理機制,而Java、C#、js等語言自帶了記憶體管理機制。記憶體管理就是容比較易出問題的一個地方,對程式設計師要求很高。
    從運行時看,大部分C語言編譯之後直接跑在硬件,語任何錯誤都直接反應到硬體上;而與之相對的解釋型語言或者編譯後跑在虛擬機上的語言,解釋器或虛擬機器本身在執行過程中會做很多檢查,盡可能的避免奔潰。

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 13:06:59

    應該是程式設計時就有漏洞,從而在運行上反映了程式碼設計的漏洞。
    C語言需要全面掌握編譯器特性以及相關電腦底層知識

    另外一方面就是多看看大牛們的程式碼,多調試。多多熟悉編譯器,多使用成熟的監測工具

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 13:06:59

    修正個拼字錯誤core dump

    回覆
    0
  • 阿神

    阿神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…

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 13:06:59

    程式設計時誰都不想讓它出問題
    c語言 太多的記憶體操作 太容易越界
    沒有一定經驗 很難寫出優秀的程式碼~

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 13:06:59

    這種用一部分的說法,就是「直譯成彙編」的程式語言,除了具備現代編譯語言的基本形態,其實還是走得比較底層的開發路線吧,加上因為允許程式設計師任意使用指針,編譯器也不敢管太多。所以對開發者本身的素質要求就高了很多,對於像我這種只學過js的人,c語言根本就是什麼都在自己管理…

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 13:06:59

    開發者層級問題
    linux/unix這不都還算穩定嗎

    回覆
    0
  • 阿神

    阿神2017-04-17 13:06:59

    主要問題是用C語言時,記憶體由程式設計師自己管理,記憶體管理不好,就掛了。
    典型:

    1. 空指標訪問,導致程式掛掉。

    2. 野指針訪問,例如某指針指向的內容已經失效,再去訪問該不可控指針,導致程式掛掉。

    3. 記憶體越界訪問,即通常所說的“記憶體被踩了”,例如數組越界寫內存,修改了未知資料區。這種操作極度危險和隱蔽,通常很難定位。
      C語言把很多事情交由程式設計師自己管理,在提高靈活性和效能的基礎上也存在穩定性方面的風險。這是一把雙面刃,提升自己的水平才能游刃有餘,否則可能適得其反。

    回覆
    0
  • 迷茫

    迷茫2017-04-17 13:06:59

    其實真正的原因是人的原因。

    很多語言,譬如C#和Java,有一個設計良好的異常處理系統。很多程式設計師,寧可冒著資料出錯的風險,也不想程式掛掉,於是做什麼都catch一下,把不認識的exception隨便找個地方log一下就忽略了。

    然而C語言卻沒有這樣省事的做法,雖然同樣程式都寫得很差,但是在C語言這邊就表現的容易掛。

    回覆
    0
  • 取消回覆