對C語言一直都是抱着學習的态度,很多都不懂,今天突然被問道C語言的記憶體配置設定問題,說了一些自己知道的,但感覺回答的并不完善,是以才有這篇筆記,總結一下C語言中記憶體配置設定的主要内容。


兩段代碼都很簡單,輸出一段字元,類型不同,一個是char*字元串,一個是char[]資料。
結果你知道嗎? 這個我确實知道,相信大部分人也都回知道,必然有一個不好使,或者兩個都不好使!!!都對就沒意思了~
結果:第一個正确輸出,第二個輸出亂碼。
原因:在于局部變量的作用域和記憶體配置設定的問題,第一char*是指向一個常量,作用域為函數内部,被配置設定在程式的常量區,直到整個程式結束才被銷毀,是以在程式結束前常量還是存在的。而第二個是數組存放的,作用域為函數内部,被配置設定在棧中,就會在函數調用結束後被釋放掉,這時你再調用,肯定就錯誤了。
什麼是局部變量、全局變量和靜态變量?
顧名思義,局部變量就是在一個有限的範圍内的變量,作用域是有限的,對于程式來說,在一個函數體内部聲明的普通變量都是局部變量,局部變量會在棧上申請空間,函數結束後,申請的空間會自動釋放。而全局變量是在函數體外申請的,會被存放在全局(靜态區)上,知道程式結束後才會被結束,這樣它的作用域就是整個程式。靜态變量和全局變量的存儲方式相同,在函數體内聲明為static就可以使此變量像全局變量一樣使用,不用擔心函數結束而被釋放。


malloc函數的實質展現在,它有一個将可用的記憶體塊連接配接為一個長長的清單的所謂空閑連結清單。調用malloc函數時,它沿連接配接表尋找一個大到足以滿足使用者請求所需要的記憶體塊。然後,将該記憶體塊一分為二(一塊的大小與使用者請求的大小相等,另一塊的大小就是剩下的位元組)。接下來,将配置設定給使用者的那塊記憶體傳給使用者,并将剩下的那塊(如果有的話)傳回到連接配接表上。調用free函數時,它将使用者釋放的記憶體塊連接配接到空閑鍊上。到最後,空閑鍊會被切成很多的小記憶體片段,如果這時使用者申請一個大的記憶體片段,那麼空閑鍊上可能沒有可以滿足使用者要求的片段了。于是,malloc函數請求延時,并開始在空閑鍊上翻箱倒櫃地檢查各記憶體片段,對它們進行整理,将相鄰的小空閑塊合并成較大的記憶體塊。如果無法獲得符合要求的記憶體塊,malloc函數會傳回NULL指針,是以在調用malloc動态申請記憶體塊時,一定要進行傳回值的判斷。
棧區(stack)—由編譯器自動配置設定釋放,存放函數的參數值,局部變量的值等。其操作方式類似于資料結構中的棧。
堆區(heap)—一般由程式員配置設定釋放,若程式員不釋放,程式結束時可能由OS回收。注意它與資料結構中的堆是兩回事,配置設定方式倒是類似于連結清單
全局區(靜态區)(static)—全局變量和靜态變量的存儲是放在一塊的,初始化的全局變量和靜态變量在一塊區域,未初始化的全局變量和未初始化的靜态 變量在相鄰的另一塊區域。 程式結束後由系統釋放。
常量區—常量字元串就是放在這裡的,直到程式結束後由系統釋放。上面的問題就在這裡!!!
代碼區—存放函數體的二進制代碼。


此外,還有realloc(重新配置設定記憶體)、calloc(初始化為0)、alloca(在棧上申請記憶體,自動釋放)等。
本文轉自cococo點點部落格園部落格,原文連結:http://www.cnblogs.com/coder2012/p/3150757.html,如需轉載請自行聯系原作者