1. 程式人生 > >面試知識點-- 作業系統執行可執行程式時,記憶體分配是怎樣的?

面試知識點-- 作業系統執行可執行程式時,記憶體分配是怎樣的?

一般認為在c中分為這幾個儲存區:
    1. 棧 --有編譯器自動分配釋放 
    2. 堆 -- 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由OS回收 
    3. 全域性區(靜態區) -- 全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。程式結束釋放。 
    4. 另外還有一個專門放常量的地方。程式結束釋放。    在函式體中定義的變數通常是在棧上,用malloc, calloc, realloc等分配記憶體的函式分配得到的就是在堆上。在所有函式體外定義的是全域性量,加了static修飾符後不管在哪裡都存放在全域性區(靜態區),在所有函式體外定義的static變量表示在該檔案中有效,不能extern到別的檔案用,在函式體內定義的static表示只在該函式體內有效。另外,函式中的"adgfdf"這樣的字串存放在常量區。 
比如:程式碼: 
int a = 0; //全域性初始化區 
char *p1; //全域性未初始化區 
main() 

    int b; //棧 
    char s[] = "abc"; //棧 
    char *p2; //棧 
    char *p3 = "123456"; //123456\0在常量區,p3在棧上。 
    static int c = 0; //全域性(靜態)初始化區 
        p1 = (char *)malloc(10); 
    p2 = (char *)malloc(20); 
    //分配得來得10和20位元組的區域就在堆區。 
    strcpy(p1, "123456"); 
    //123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一塊。 


    還有就是函式呼叫時會在棧上有一系列的保留現場及傳遞引數的操作。 
    棧的空間大小有限定,vc的預設是2M。棧不夠用的情況一般是程式中分配了大量陣列和遞迴函式層次太深。有一點必須知道,當一個函式呼叫完返回後它會釋放該函式中所有的棧空間。棧是由編譯器自動管理的,不用你操心。 
    堆是動態分配記憶體的,並且你可以分配使用很大的記憶體。但是用不好會產生記憶體洩漏。並且頻繁地malloc和free會產生記憶體碎片(有點類似磁碟碎片),因為c分配動態記憶體時是尋找匹配的記憶體的。而用棧則不會產生碎片。 
    在棧上存取資料比通過指標在堆上存取資料快些。 
    一般大家說的堆疊和棧是一樣的,就是棧(stack),而說堆時才是堆heap. 棧是先入後出的,一般是由高地址向低地址生長。

相關推薦

面試知識點-- 作業系統執行執行程式記憶體分配是怎樣的?

一般認為在c中分為這幾個儲存區:     1. 棧 --有編譯器自動分配釋放      2. 堆 -- 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由OS回收      3. 全域性區(靜態區) -- 全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全

作業系統執行執行程式記憶體是如何分配的?

一般認為在c中分為這幾個儲存區:     1. 棧 --有編譯器自動分配釋放      2. 堆 -- 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由OS回收      3. 全域性區(靜態區) -- 全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全

linux 執行程式提示not found問題分析

sh: ./test: not found 通常可以通過readelf檢視該程序檔案所以依賴的執行環境,檢查相關路徑是否存在對應的檔案, 注意 1. interpreter是絕對路徑,設定LD_LIBRARY_PATH指向對應目錄對於部分系統則無效 2. Shared library可以是相

執行OK6410攝像頭程式出現Unable to handle kernel NULL pointer dereference at virtual address 00000060

[[email protected]]# ./test_usb_camera  Unable to handle kernel NULL pointer dereference at virtual address 00000060 pgd = c3d70000 [000

用nohup執行python程式print無法輸出

nohup Python test.py > nohup.out 2>&1 & 發現nohup.out中顯示不出來python程式中print的東西。 這是因為pyt

sublime text直接執行python程式如何在控制檯輸入資料?

    sublime text是目前用的最多的編輯器了,相信很多人都在用,強大到無需多言。但用它來直接執行python時(F7或ctrl+B),在它自帶的控制檯裡是無法輸入的,對於只需要看輸出的程式是夠用了,但需要互動輸入的程式就傻了。個人猜測(也暫沒能力去深究),subl

Pycharm下執行除錯Python專案當除錯既需要給除錯的程式傳入命令列引數又需要程式在設定的斷點處停下里檢視變數的解決方法

  今天在除錯了一個複雜的Python專案,其中這個專案的除錯需要事先從命令列讀取引數,並且在除錯期間需要再事先設定的斷點處停下來。檢查相關的變數。   問題是,在Pycharm的Terminal 輸入檔名+引數後,程式就處於執行狀態,除非程式出錯,否則程式會一

通過go語言執行執行程式並獲得命令列輸出的方法

首先,通過go語言執行可執行程式需要用到os/exec包 package exec import "os/exec" exec包執行外部命令 步驟: 寫一個go語言小程式並通過go build命令來編譯成可執行檔案p

關於vs2010執行C程式執行結果視窗一閃而過的問題

用VC++6.0和VS中的C++程式設計,今天正常安裝好後,編寫一個正確的程式,可執行的時候,DOS視窗一晃而過,也算是正常編譯了,但我不懂的是它為什麼消失得這麼快? 會出現dos介面是因為你程式中可能用到了需要用dos顯示結果(或者輸入之類的)的函式,比如printf()函式,馬上消失是因為你執行程式是一步

Linux shell中執行執行程式後加上&的作用

學習UNP時,學到了在命令後加上字元“&”後,退出shell,執行的命令可以繼續執行。不解原因,併到網上搜索了以下,明白了! 以下是搜尋到的片段: & 放在啟動引數後面表示設定此程序為後臺程序 預設情況下,程序是前臺程序,這時就把Shell給佔據了,我們無法

[Arduino]新增輸出執行程式串列埠顯示器的輸出亂碼

[Arduino]執行程式時,串列埠顯示器的輸出亂碼 寫程式時,有時會因為多加了一個Serial.println("......"),導致整個程式原有的正確輸出變為亂碼輸出。 此時將新增加的輸出語句變短一點,或刪除,程式就可正確執行。 感覺這是arduino的一個bug

VS2012在執行C++Win32程式出現一閃而過的解決方法

在使用VS2012執行C++Win32程式時,在執行時會出現一閃而過的情況,解決辦法就是:  在_tmain()函式的return 句之前加上:getchar(); 這是目前我試驗後可行的方法,如果有更好的解決方法,歡迎留言。 方法二:Ctrl+F5進行編譯。 有沒有知道為

ios 程式記憶體執行記憶體分幾個區各自用途?

 1 棧 --有編譯器自動分配釋放  2. 堆 -- 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時    可能由OS回收   3. 全域性區(靜態區) -- 全域性變數和靜態變數的儲存是放在一塊 的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和

MATLAB生成exe脫離matlab執行執行程式

如何將MATLAB程式編譯成獨立可執行的程式?如何將編譯好的獨立可執行程式釋出在沒有安裝MATLAB的電腦上?下面將一步步實現: 一、生成獨立可執行的程式(exe檔案)步驟 1、安裝編譯器。可有

MS SQL執行大腳本文件提示“未能完成操作,存儲空間不足,無法處理此命令”的解決辦法

test 備份 問題 -s bsp lib sdn 但是 str 問題描述: 當客戶服務器不允許直接備份時,往往通過導出數據庫腳本的方式來部署-還原數據庫, 但是當數據庫導出腳本很大,用Microsoft SQL Server Management Studio執行腳本時,

MSSQL執行大腳本文件提示“內存不足”的解決辦法

-c 但是 gem 服務 targe 腳本文件 manage 回來 腳本 導出了一個腳本文件,將近900M,回來往sql studio一丟,報了個內存不足,然後就有了此文.. 問題描述: 當客戶服務器不允許直接備份時,往往通過導出數據庫腳本的方式來部署-還原數據庫, 但

mysql執行大量的操作報無法連接數據庫的錯誤

mysql執行大量的操作時 報無法連接數據庫的錯誤 問題:mysql執行大量的插敘操作時,報無法連接數據庫的錯誤,錯誤詳情如下:Fatal error: Uncaught exception ‘PDOException‘ with message ‘SQLSTATE[HY000] [2003] Can

系統在執行執行文件幾個過程

div details 通過 mac 文件 可執行 了解 總結 .net 通過分析下面這個最熟悉的可執行文件,來好好總結和了解下Mach-O這種文件格式,並且也總結下系統在執行可執行文件幾個過程: + 解析文件 + 依賴建立 + 初始化運行環境 + 執行進程 http:

mybatis執行刪除delete語句不報異常執行

nnd,沒有報紅異常資訊,從來沒碰見過的問題,仔細發現只找到一個 was not registered for synchronization because synchronization is not active 異常,我就找啊找啊找,百度說是事務異常,還有說重複掃

python呼叫unittest組織執行測試用例autoit按鍵不能釋放指令碼卡住的情況

suite.addTest(Test_PcIndexPage(“test_getindexpage”)) #開啟pc首頁 suite.addTest(Test_Pclogin(“test_pcLogin”)) #登入 在第一個指令碼的結尾處加上如下程式碼,