作業系統執行可執行程式時,記憶體是如何分配的?
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. 全域性區(靜態區) -- 全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全
ios 程式在記憶體中執行時,記憶體分幾個區,各自用途?
1 棧 --有編譯器自動分配釋放 2. 堆 -- 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時 可能由OS回收 3. 全域性區(靜態區) -- 全域性變數和靜態變數的儲存是放在一塊 的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和
linux 執行程式時,提示not found問題分析
sh: ./test: not found 通常可以通過readelf檢視該程序檔案所以依賴的執行環境,檢查相關路徑是否存在對應的檔案, 注意 1. interpreter是絕對路徑,設定LD_LIBRARY_PATH指向對應目錄對於部分系統則無效 2. Shared library可以是相
用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 輸入檔名+引數後,程式就處於執行狀態,除非程式出錯,否則程式會一
關於vs2010執行C程式時,執行結果視窗一閃而過的問題
用VC++6.0和VS中的C++程式設計,今天正常安裝好後,編寫一個正確的程式,可執行的時候,DOS視窗一晃而過,也算是正常編譯了,但我不懂的是它為什麼消失得這麼快? 會出現dos介面是因為你程式中可能用到了需要用dos顯示結果(或者輸入之類的)的函式,比如printf()函式,馬上消失是因為你執行程式是一步
[Arduino]新增輸出,執行程式時,串列埠顯示器的輸出亂碼
[Arduino]執行程式時,串列埠顯示器的輸出亂碼 寫程式時,有時會因為多加了一個Serial.println("......"),導致整個程式原有的正確輸出變為亂碼輸出。 此時將新增加的輸出語句變短一點,或刪除,程式就可正確執行。 感覺這是arduino的一個bug
MS SQL執行大指令碼檔案時,提示“記憶體不足”的解決辦法
問題描述: 當客戶伺服器不允許直接備份時,往往通過匯出資料庫指令碼的方式來部署-還原資料庫, 解決辦法: 用微軟自帶的sqlcmd工具,可以匯入執行。以SQL Server 2008R版本為例: 第一步:Win+R 鍵入:cmd 命令,開啟命令列工具; 第二步:鍵入:cd
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
執行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
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”)) #登入 在第一個指令碼的結尾處加上如下程式碼,
C# 多執行緒操作介面時,使用Invoke與BeginInvoke的區別
Invoke方法的引數很簡單,一個委託,一個引數表(可選),而Invoke方法的主要功能就是幫助你在 UI執行緒(即建立控制元件的執行緒)上呼叫委託所指定的方法。Invoke方法首先檢查發出呼叫的執行緒(即當前執行緒)是不是UI執行緒,如果是,直接執行委託指向 的方法
執行jetty-maven-plugin時,出現錯誤
[ERROR] Failed to execute goal org.eclipse.jetty:jetty-maven-plugin:9.4.0.v20161208:run (default-cli) on project kind-perm-web: Execution
通過go語言執行可執行程式並獲得命令列輸出的方法
首先,通過go語言執行可執行程式需要用到os/exec包 package exec import "os/exec" exec包執行外部命令 步驟: 寫一個go語言小程式並通過go build命令來編譯成可執行檔案p
在Windows 2008 R2高階機器上執行SQL Server 2008時,CPU個數的考量
我們知道SQL Server所能檢測到的CPU是邏輯CPU個數。而不是物理CPU個數。雙核CPU對於SQL Server來講,是兩個邏輯CPU,如果有超執行緒的話,CPU個數還要翻一倍。邏輯CPU個數,通常能在Windows 的Task Manager裡顯示出來, 在CPU Usage Histo