1. 程式人生 > >C語言筆試題紀錄(一)

C語言筆試題紀錄(一)

分配方式有三種:
  1、從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static變數。
  2、在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。
  3、從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由程式設計師決定,使用非常靈活,但如果在堆上分配了空間,就有責任回收它,否則執行的程式會出現記憶體洩漏,頻繁地分配和釋放不同大小的堆空間將會產生堆內碎塊。

常見的錯誤      

關於記憶體的一些知識已在記憶體分配中提及,現記錄與分享常見的記憶體錯誤與對策。
型別 1:記憶體未分配成功,卻使用了它。
方   法:在使用之前檢查指標是否為NULL。
             1)當指標p是函式的引數時,在函式入口處用語句assert(p!=NULL)進行斷言檢查。
             2)當使用malloc或new來申請記憶體時,應該用if(p != NULL)進行防錯檢查。
型別 2:引用了尚未初始化的指標
原   因:記憶體的預設初始值究竟是什麼並沒有統一的標準,在使用之前都進行初始化。
              1)沒有初始化的觀念。
              2)記憶體的預設值是未定義,即垃圾值。
型別 3:越界操作記憶體
原   因:記憶體分配成功且初始了,但越界操作是不允許的。
型別 4:忘記釋放記憶體,造成記憶體洩漏。
原   因:含有這種型別錯誤的函式,每被呼叫一次,就丟失一塊記憶體。當記憶體充足時看不到這種錯誤帶來的影響,當記憶體耗盡時系統提示:“記憶體耗盡”。因此,動態記憶體的申請與釋放必須配對,程式中malloc與free的使用次數要相同。
型別 5:釋放了記憶體卻繼續使用它
原   因:對應的情況有2種
              1)返回了“棧記憶體的指標或引用”,因為堆疊中的變數在函式結束後自動銷燬。
              2)某塊記憶體被free後,沒有將指向該記憶體的指標設定為NULL,導致產生“野指標”。