1. 程式人生 > >c語言分配記憶體方式有哪些?c語言中常見的記憶體錯誤有哪些?

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,導致產生“野指標”。

相關推薦

招投標常見的行話哪些

在招投標過程中會有一些內行人說行話,行話是指一些特定專業人士之間的用語,為了幫助討論議題,這些用語當中有許多在發展過程中逐漸簡化,例如可能會直接使用縮寫而不必附加解釋。以下就是常見的一些行話,中國招標採購導航網介紹給大家: 1、流標 “流標”一詞中的“流”字與“

Android開發常見記憶體洩漏問題

##一、記憶體洩漏原因 當一個物件不再使用時,本該被回收,而另一個正在使用的物件持有它的引用導致不能被回收,就產生了記憶體洩漏。 ##二、記憶體洩漏的影響 Android系統為每個應用程式分配的記憶體有限,當應用中記憶體洩漏較多時,輕則造成可用空間不足,頻繁發生gc,表現為應用執行卡

HTML三大選擇器的使用和命名方式,優先順序,以及選擇器常見錯誤及解決方法

HTML中的三大選擇器1.標籤選擇器:使用標籤的名稱作為選擇器,選中標籤設定樣式, 特點:可以選中多個標籤,給一堆標籤同時設定樣式書寫方式 標籤名{ 樣式 }2.類選擇器:在標籤中利用class屬性設

S3C6410開發全紀錄(二)《如何計算記憶體大小,並在UBOOT調整記憶體大小》

前章我們已經可以製作出用來啟動的SD卡了,並將自己編譯的UBOOT燒錄到了SD卡中這份UBOOT程式碼中的記憶體配置肯定和手頭的開發板不一致,這裡我們將搞清楚如何修改記憶體大小,並說清楚記憶體大小到底是如何計算的一、關於記憶體大小的計算1)硬體的型號,在飛凌的開發板中128M

c語言分配記憶體方式哪些c語言常見記憶體錯誤哪些

記憶體分配方式有三種:   1、從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static變數。   2、在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放

指標陣列&陣列指標的分配記憶體及函式引數 C語言

最近寫程式碼總是被基礎知識卡住,十分耽誤時間,今天又卡住了。所以下定決心一定要弄清楚這個問題,然後不好的是網上的資料總是解決的並不清楚,總是在糾結什麼是指標陣列什麼是陣列指標,看了《C缺陷和陷阱》也沒有我想要的東西。要麼就是C和C++混為一談,new int[5

C語言變數儲存型別哪些

    變數的儲存型別是C語言的重要組成部分,也是C語言學習的基礎。那C語言中變數的儲存型別有哪幾種呢?在程式設計過程中又該怎樣運用呢?就這一問題,我今天給大家介紹一下!總的來說,C語言中變數的儲存型別可以分為四種,他們分別是自動變數、靜態變數、外部變數和暫存器變數這四種,

C語言記憶體分配問題和C語言記憶體

C語言記憶體分配問題 1、C中記憶體分為四個區棧:用來存放函式的形參和函式內的區域性變數。由編譯器分配空間,在函式執行完後由編譯器自動釋放。 堆:用來存放由動態分配函式(如malloc)分配的空間。是由程式設計師自己手動分配的,並且必須由程式設計師使用free釋放。如果忘記用

C語言之_指標陣列、結構體、動態記憶體分配

1、sizeof() int main() { int a[20]; int count=sizeof(a)/sizeof(int); printf(“%d\n”,count); return 0; } 2、指標陣列

C語言記憶體的五大區域/CC++在記憶體的儲存方式

簡單來說,C/C++在記憶體中的儲存佔用五個區域,分別是:棧區Stack、堆區Heap、BSS區、資料區(常量區)Data和程式碼區Text。其中,棧區由系統在編譯過程中自動分配;堆區在程式的執行過程中動態分配,由程式設計師控制堆區儲存的開闢和釋放;程式中的常量資料被分散在兩個區記憶體儲,一個是BSS區,儲存

C語言高階---4.9.12--雙鏈表--刪除節點(雙鏈表的完整程式)(12)

朱有鵬C語言高階---4.9.12--雙鏈表--刪除節點(12)   刪除的過程就是一個遍歷的過程。   刪除尾節點   刪除普通節點   程式碼如下: #include <stdio.h> #inc

C語言高階---4.9.11--雙鏈表--遍歷節點(11)

朱有鵬C語言高階---4.9.11--雙鏈表--遍歷節點(11)   遍歷節點 (1)雙鏈表是單鏈表的一個父集。雙鏈表中如何完全無視pPrev指標,則雙鏈表就變成了單鏈表。這就決定了雙鏈表的正向遍歷(後向遍歷)和單鏈表是完全相同的。 (2)雙鏈表中因為多了pPrev指標,因

C語言高階---4.9.10--雙鏈表--頭插入和尾插入(10)

朱有鵬C語言高階---4.9.10--雙鏈表--頭插入和尾插入(10)   尾插入:   頭插入:   注意下面的程式碼中,insert_head()函式裡面語句的順序,第一語句和第二語句的順序可以互相調換,但是第一語句和第二語句要在

C語言高階---4.9.9--雙鏈表--引入和實現(9)

朱有鵬C語言高階---4.9.9--雙鏈表--引入和實現(9)   單鏈表的侷限性 (1)單鏈表是對陣列的一個擴充套件,解決了陣列的大小比較死板不容易擴充套件的問題。使用堆記憶體來儲存資料,將資料分散到各個節點之間,其各個節點在記憶體中可以不相連,節點之間通過指標進行單向連線。

C語言高階---4.9.8-單鏈表--逆序(單鏈表的完整程式)(8)

朱有鵬C語言高階---4.9.8-單鏈表--逆序(8)   什麼是連結串列的逆序? 連結串列的逆序又叫反向,意思就是把連結串列中所有的有效節點在連結串列中的順序給反過來。   單鏈表逆序演算法分析 (1)當我們對一個數據結構進行一個操作時,我們就需要一套演

C語言高階---4.9.3--單鏈表--從連結串列的頭部插入節點(3)

朱有鵬C語言高階---4.9.2--單鏈表--訪問單鏈表中各個節點的資料(1) 朱有鵬C語言高階---4.9.3--單鏈表--將建立節點的程式碼封裝成一個函式(2) 朱有鵬C語言高階---4.9.3--單鏈表--從連結串列的頭部插入節點(3)   從連結串列的尾部插入節點

C語言高階---4.9.3--單鏈表--將建立節點的程式碼封裝成一個函式(2)

  朱有鵬C語言高階---4.9.2--單鏈表--訪問單鏈表中各個節點的資料(1) 朱有鵬C語言高階---4.9.3--單鏈表--將建立節點的程式碼封裝成一個函式(2)     原始碼:4.9.3danlianbiao2.c #include &

C語言高階---4.9.2--單鏈表--訪問單鏈表各個節點的資料(1)

朱有鵬C語言高階---4.9.2--單鏈表--訪問單鏈表中各個節點的資料(1) 朱有鵬C語言高階---4.9.3--單鏈表--將建立節點的程式碼封裝成一個函式(2)   構建一個簡單的單鏈表 目標:構建一個連結串列,然後將一些資料(譬如1,2,3三個數字)儲存在連結串列中,

C語言高階---4.9.6--單鏈表--遍歷節點(6)

朱有鵬C語言高階---4.9.6--單鏈表--遍歷節點(6)   什麼是遍歷 (1)遍歷就是把單鏈表中的各個節點挨個拿出來,就叫遍歷。 (2)遍歷的要點:一是不能遺漏、二是不能重複、追求效率。   如何遍歷單鏈表 單鏈表的特點就是由很多個節點組成,頭指

C語言高階---4.9.5--單鏈表--從連結串列頭部插入新節點(5)

   朱有鵬C語言高階---4.9.5--單鏈表--從連結串列頭部插入新節點(5)   從連結串列頭部插入新節點 (1)注意寫程式碼過程中的箭頭符號 ( -> ),和說話過程中的指標指向。這是兩碼事,容易搞混。箭頭符號實際上是用指標方式來訪問結構體