C程序的儲存空間是如何分配?

可執行程序包括BSS段、數據段、代碼段。

在類UNIX系統下可使用size命令查看可執行文件的段大小信息。如size a.out:

~/Desktop/MyC$ size a.outtext	   data	    bss	    dec	    hex	filename1672	    600	      8	   2280	    8e8	a.out

1.數據段存放已初始化的全局變量和靜態變量,數據段屬于靜態內存分配。
2.BSS段(Block Started by Symbol)存放未初始化的全局變量和靜態變量。
????????BSS段的數據是可讀寫的,鏈接器從可執行文件中得到BSS段的大小,然后申請得到這塊內存空間,這塊內存空間緊跟在數據段的后面。由此可知BSS段并不占用可執行文件的大小。在使用BSS段之前BSS段會自動初始化為0。所以,未初始的全局變量和靜態變量在程序執行之前已經是0了。BSS段屬于靜態內存分配。

包含數據段和BSS段的整個區段通常稱為數據區。

3.代碼段:用來存放程序的代碼內存空間。它的大小在程序運行前就已經確定了,并且該區域只能讀不能寫。在代碼段中,也有可能包含了一些只讀的常數變量,例如字符串常量等。

????????代碼段和數據段在編譯時已經分配了空間,而BSS段則在程序被調入內存后才分配的。因此BSS段(未進行初始化的數據)的內容并不存放在磁盤上的程序文件中。需要存放在程序文件中的只有代碼段和數據段(存放已初始化的全局變量和靜態變量)的內容。

????????程序編譯后生成的目標文件至少含有這三個段,這三個段的大致結構圖如下所示:

在這里插入圖片描述在這里插入圖片描述

可執行程序在運行時會多出兩個區域:棧區和堆區。
4.棧區:由操作系統自動分配和釋放 ,存放函數的參數值,局部變量的值等。每當一個函數被調用時,該函數的返回類型和一些調用的信息也會被存放到棧中。然后這個被調用的函數再為它的自動變量和臨時變量在棧上分配空間。每調用一個函數一個新的棧就會被使用。棧區是從高地址位向低地址位增長的,是一塊連續的內存區域,最大容量是由系統預先定義好的,申請的棧空間超過這個界限時會提示溢出,用戶能從棧中獲取的空間較小。

小知識:
自動變量:什么是自動變量呢?自動變量就是指在函數內部定義使用的變量。只能在函數內部使用它。自動變量是局部變量,即它的作用區域是在定義它的函數內部。由于自動變量在定義它的函數的外部是不可見的,所以允許我們在這個函數外部或者其他的函數內部定義同名的變量。計算機在執行這個函數的時候,創建這個變量并為它分配內存,當函數執行完畢返回后,自動變量就會被銷毀。為自動變量分配內存就是壓棧,而函數返回時就退棧。
臨時變量是指在未在程序開頭部分聲明的,待使用它時才聲明類型的變量。常見的如函數中定義的變量,循環語句、條件語句中聲明定義的變量。這些變量可與主程序中的變量同名,在其作用域里,主程序中的同名變量一般無法調用。并且這種變量有效存在時間是從變量聲明開始到相應程序段(循環結構或函數體)結束。

5.堆區:用于動態分配內存,位于BSS和棧中間的地址區域。由程序員親自用malloc()申請分配和用free()釋放。堆是從低地址位向高地址位增長,采用鏈式存儲結構。頻繁的 malloc/free造成內存空間的不連續,產生碎片。當申請堆空間時庫函數是按照一定的算法搜索可用的足夠大的空間。因此堆的效率比棧要低的多。

最后提示一下:內存泄漏是指內存分配出去以后,你再也訪問不到了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272507.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272507.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272507.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

詳細講解Android的網絡通信(HttpUrlConnection和HttpClient)

前言,Android的網絡通信的方式有兩種:使用Socket或者HTTP,今天這一篇我們詳細講解使用HTTP實現的網絡通信,HTTP又包括兩種方式編程方式: (1)HttpUrlConnection; (2&#…

常見通信協議HTTP、TCP、UDP的簡單介紹

TCP HTTP UDP:都是通信協議,也就是通信時所遵守的規則,只有雙方按照這個規則“說話”,對方才能理解或為之服務。TCP HTTP UDP三者的關系:TCP/IP是個協議組,可分為四個層次:網絡接口層、網絡層、傳輸層和應用層…

創建進程相關函數

fork函數 pid_t fork(void); fork函數調用成功, 返回兩次 在fork函數執行完畢后 如果創建新進程成功,則出現兩個進程 一個是子進程,一個是父進程 在子進程中,fork函數返回0 在父進程中,fork返回新創建子進程的進程ID…

實現Windows和Linux之間的文件共享

一、windows 向linux共享文件(這里都是以win10和ubuntu為例)首先,打開網絡共享中心。如圖1圖1打開更改高級共享設置(圖2)圖 2選擇啟用網絡發現以及啟用文件和打印機共享,然后點擊保存更改。接著,選擇你要共享的文件夾&…

雞啄米MFC教程筆記之七:對話框:為控件添加消息處理函數

MFC為對話框和控件等定義了諸多消息,我們對它們操作時會觸發消息,這些消息最終由消息處理函數處理。比如我們點擊按鈕時就會產生BN_CLICKED消息,修改編輯框內容時會產生EN_CHANGE消息等。一般為了讓某種操作達到效果,我們只需要實…

進程的退出方式以及僵尸進程和孤兒進程

(1)正常退出 (2)異常退出 檢查wait和waitpid所返回的終止狀態的宏 宏說明WIFEXITED(status)若為正常終止子進程返回的狀態,則為真。對于這種情況可執行WEXITSTATUS(status),取子進程傳送給exit、_exit或_…

java中的動態代理----自己手動實現

代碼使用了common-io,需要其jar 1 接口 Java代碼 public interface Pruduct { void selling(); } 2 書籍類 Java代碼 public class Book implements Pruduct { Override public void selling() { try { Thread.sleep(1000…

Code Project精彩系列(1)

ApplicationsCrafting a C# forms Editor From scratchhttp://www.codeproject.com/csharp/SharpFormEditorDemo.asp建立一個類似C#的環境, 實現控件拖拉,屬性Packet Capture and Analayzer網絡封包截獲http://www.codeproject.com/csharp/pacanal.aspA tool to cha…

linux進程---exec族函數(execl, execlp, execv, execvp, )解釋和配合fork的使用

exec族函數函數的作用: exec函數族的作用是根據指定的文件名找到可執行文件,并用它來取代調用進程的內容,換句話說,就是在調用進程內部執行一個可執行文件。這里的可執行文件既可以是二進制文件,也可以是任何L…

Code Project精彩系列(2)

Windows FormsFireball Resourcer把各種資源嵌入應用程序資源Window Hiding with C#隱藏窗體, 似乎是其它運行的窗體 JProper Threading in Winforms .NETWindows Forms User Settings in C#使用VS設置設定forms, coolA Pretty Good Splash Screen in C#一個自繪可愛屏幕A curt…

python bool值要注意的一些地方

1、像(),[],{}這三個是可以通過bool(()),bool([]),bool({})轉化為bool值的;且它們轉化后的結果為False。但是這三個值它本身并不等于False、切記不可以與False 直接進行比較。 #!/usr/bin/python #!coding:utf-8 import sysif __name__ "__main__":falseL…

system函數和popen函數使用方法

system int system(const char *command);system()函數的返回值如下: 成功,則返回進程的狀態值; 當sh不能執行時,返回127; 失敗返回-1; 其實是封裝后的exec,函數源代碼在…

前端必備知識點—SVG

基本內容什么是SVG? 全稱為Scalable Vector Graphics,是一種使用XML技術描述二維圖形的語言,簡單來說 - 矢量圖(不失真)SVG與HTML5的關系早在HTML5之前,存在SVG技術SVG文件擴展名為".svg"在HTML5出現之前,要在HTML頁面中引入SVG文件在HTML5出…

CocoaPods安裝和使用及問題:Setting up CocoaPods master repo

CocoaPods是什么? 當你開發iOS應用時,會經常使用到很多第三方開源類庫,比如JSONKit,AFNetWorking等等。可能某個類庫又用到其他類庫,所以要使用它,必須得另外下載其他類庫,而其他類庫又用到其他…

進程間的通信IPC(無名管道和命名管道)

進程間的通信IPC介紹 進程間通信(IPC,InterProcess Communication)是指在不同進程之間傳播或交換信息。 IPC的方式通常有管道(包括無名管道和命名管道)、消息隊列、信號量、共享存儲、Socket、Streams等。其中 Socket…

那些關于瀏覽器的趣圖和幽默段子

1、當瀏覽器化作一種槍,你喜歡用哪種呢?2、這神奇的反射弧,有點長…3、瀏覽器們成長的煩惱4、這么說來,IE瀏覽器扳回一分!5、如何用瀏覽器區分 HTML和 HTML56、都在吹牛,還是IE最務實!7、主流瀏…

前端新手程序員不知道的 20個小技巧

1.作為前端開發者,使用雙顯示器能大幅提高開發效率。2.學編程最好的語言不是PHP,是English。3.東西交付之前偷偷測試一遍。4.問別人之前最好先自己百度,google一下,以免問出太低級的問題。5.把覺得不靠譜的需求放到最后做&#xf…

IPC 共享內存和 消息隊列(發送、接收、移除)以及鍵值的生成

一、消息對列 消息隊列,是消息的鏈接表,存放在內核中。一個消息隊列由一個標識符(即隊列ID)來標識。 特點: 消息隊列是面向記錄的,其中的消息具有特定的格式以及特定的優先級。消息隊列獨立于發送與接收進…

DBA十大必備工具(SQLServer)

曾經和一些DBA和數據庫開發人員交流時,問他們都用過一些什么樣的DB方面的工具,大部分人除了SSMS和Profile之外,基本就沒有使用過其他工具了;誠然,SSMS和Profile足夠強大,工作的大部分內容都能通過它們搞定&…

linux 信號和信號量編程

對于 Linux來說,實際信號是軟中斷,許多重要的程序都需要處理信號。信號,為 Linux 提供了一種處理異步事件的方法。比如,終端用戶輸入了 ctrlc 來中斷程序,會通過信號機制停止一個程序。 信號概述 信號的名字和編號&…