內存的管理方式

1、內存的區域

??? 對于內存的區域劃分上,不同的區域劃分上都各有不同。

劃分1:

代碼區、堆、棧、 全局區(靜態存儲區)、 文字常量區、

劃分2:

代碼段、堆、棧、? data段、BSS段、文字常量區

全局區:

??? 又成為靜態存存儲區。保存的是全局變量和靜態變量(帶有static 關鍵字)。全局區分為兩個區域:一個區域保存的是經過初始化,且初始化的值不為零的全部變量和靜態變量;一個區域保存的是沒有經過初始化或者初始化的值為零的。程序結束由 OS 進行釋放

常量區:

??? 將一些不可以被更改的只讀的常量進行保存的區域。比如文字字符串等。程序結束之后由系統釋放。

代碼區:

??? 保存的是二進制代碼的區域。

堆:

??? 由程序猿手動 malloc/free進行開辟的空間,一般也是由程序猿調用 free/delete 進行釋放,即使沒有進行釋放,也可以由 OS 進行釋放。

棧:

??? 程序運行的時候由編系統進行分配,存在函數的的局部變量等。程序結束由系統自動釋放。

DATA段:

??? 有經過初始化的全局變量和靜態變量存儲的區域,當然初始值不能為零

BSS段:

??? 保存的是沒有經過初始化的全局變量和靜態變量存儲的區域,或者經過初始化但是初始值為零的也保存在這個區域。

注意:很顯然,DATA 段和 BSS 段的也行,其實就是全局區(靜態存儲器)內部之一,DATA 段和 BSS 段只不過是全局區更加精細的劃分。

解釋:

??? 借助前人總結的知識:

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 放在常量區,編譯器可能會將它與p3所指向的"123456"                              //優化成一個地方。   
}

?

2、內存的三種來源:棧、堆、全局區

棧:

??? (1)運行時候由編譯器自動分配自動回收,這一切都是自動的,程序猿不用管理

??? (2)反復使用:每一個進程,操作系統都會為這個進程分配棧,這個進程不論是怎么出入棧,都是在這個棧,反復使用。

??? (3)臟內存:棧內存由于反復的使用,程序使用完畢之后不會去做清理的工作,所以重新使用棧的時候,值就是臟的。

??? (4)臨時性:局部變量的出棧入棧,每次都是不一樣,所以都是臨時性的,所以,絕對不要返回棧變量的指針,因為棧地址都是臨時的,

??? (5)棧溢出:因為棧的大小是操作系統設定的,當出現無線遞歸或者出現巨大的局部變量。

堆:

??? (1)大塊內存:棧的空間非常有限,所以當需要需要大塊內存的時候,就在堆進行申請,

??? (2)手動申請、釋放: 使用 malloc/new 申請,free/delete 進行釋放。

??? (3)臟內存 : 堆內存也是被反復使用的

malloc 實際應用:

??? 操作系統會對空閑的內存塊進行組織管理,而這種組織管理的方式是以鏈表的形式。當程序猿調用 malloc 的時候就從空閑的鏈表找出一塊大小滿足申請要求的空間(可以比用戶申請的大),然后將這個內存空間一分為二:一部分是用戶申請空間的大小,另外的部分是維護鏈表這個節點的基本信息(比如地址、塊內存的大小)。所以當 malloc 的時候,不論申請的空間是多大,都必須申請一塊用于維護鏈表的空間。

#include <stdio.h>
#include<stdlib.h>
int main(void)
{int i,j;FILE * fp = fopen("qxj511.txt", "w");for ( i = 0; i < 2048; i++){int *p1 = (int *)malloc(i);int *p2 = (int *)malloc(i);fprintf(fp, "i =%d : p1 = %d, p2 = %d,\n",i, p1, p2);free(p1);free(p2);        }fclose(fp); /*關閉文件*/
}

??? 在 gcc 的編譯器下面做的測試,

i =0 : p1 = 151765360, p2 = 151765376,    // 1
i =1 : p1 = 151765376, p2 = 151765360,
i =2 : p1 = 151765360, p2 = 151765376,
i =3 : p1 = 151765376, p2 = 151765360,
i =4 : p1 = 151765360, p2 = 151765376,
i =5 : p1 = 151765376, p2 = 151765360,
i =6 : p1 = 151765360, p2 = 151765376,
i =7 : p1 = 151765376, p2 = 151765360,
i =8 : p1 = 151765360, p2 = 151765376,
i =9 : p1 = 151765376, p2 = 151765360,
i =10 : p1 = 151765360, p2 = 151765376,
i =11 : p1 = 151765376, p2 = 151765360,
i =12 : p1 = 151765360, p2 = 151765376, // 1 
i =13 : p1 = 151765392, p2 = 151765416, // 2
i =14 : p1 = 151765416, p2 = 151765392,
i =15 : p1 = 151765392, p2 = 151765416,
i =16 : p1 = 151765416, p2 = 151765392,
i =17 : p1 = 151765392, p2 = 151765416,
i =18 : p1 = 151765416, p2 = 151765392,
i =19 : p1 = 151765392, p2 = 151765416,
i =20 : p1 = 151765416, p2 = 151765392,
i =21 : p1 = 151765440, p2 = 151765472,
i =22 : p1 = 151765472, p2 = 151765440, // 2
。。。。。。。

??? 經過筆者的測試,當 申請的的空間,從零到12個字節的時候,兩者的差是16個字節,后序申請的全部的空間差是 8 個字節。也就是說,實際申請的空間是鏈表頭部 + 申請的空間,同時,8 個字節是處于內存對齊。

參考 : http://blog.csdn.net/misskissc/article/details/17717717

??? (1)malloc(0) :

If size is  0,  thenmalloc()  returns either NULL, or a unique pointer value that can later be successfully passed to free().

根據官方的解釋,當申請的空間為零的時候,返回值要么是為 NULL,要么就可以正確返回一個地址,這個地址被正確釋放。但是實際上,都是返回后者。

??? 根據 malloc 的實現方式,雖然申請的空間為零,但是鏈表的指針也是會被申請一段空間的,所以可以正確申請,空間為 16 字節(maybe 8字節) + 0; 而這個鏈表指針地址其實就是 malloc 的返回值的地址。

注意: 對于鏈表維護空間的大小是16 字節,這個是不確定的,有人說是8個字節,

malloc 與 sizeof:

??? 使用 malloc 是申請了一個程序猿指定的空間,返回值是指向這段空間的的首地址。想要計算這段申請空間的大小,是不可以通過 sizeof 計算出來的:

int *p = (int *)malloc(10 * sizeof(int));
printf("%d\n", sizeof(p));

?

打印出來:

等于4

??? 原因分析,p 是指向申請空間的首地址,也就是說這個是地址,對于指針來說,不論指向的空間是多大,指針占據的就是四個字節。所以,sizeof 是不能計算 malloc。

轉載于:https://www.cnblogs.com/qxj511/p/4933705.html

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

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

相關文章

英語四六級和計算機二級是一,大學里最難考證書排名,四六級和計算機根本排不進前三...

大學是我們提高自身技能最好的一個時期&#xff0c;除了平時的課程和一些社團活動之外&#xff0c;還有一件最最必不可少的事情&#xff0c;那就是考證&#xff0c;而這也是為我們以后工作打好基礎&#xff0c;為自己多準備一些敲門磚。我國各個行業都有屬于自己的證書&#xf…

Scrapy爬蟲中的鏈接提取器LinkExtractor

今天在編寫Scrapy爬蟲的時候接觸到了LinkExtractor&#xff0c;遂學習了一下這個鏈接提取器。 Link Extractors 是那些目的僅僅是從網頁(scrapy.http.Response 對象)中抽取最終將會被follow鏈接的對象&#xff61;使用場景就是在一個網站中通過自定義規則提取到自己想要的那些網…

Fedora 安裝后需要做的第一件事

一直以來&#xff0c;Red Hat 系的許多教程&#xff0c;都會建議你關閉 SELinux。確實&#xff0c;啟用 SELinux 可能會造成許多莫名其妙的錯誤。但在實際生產環境&#xff0c;甚至是用戶工作站&#xff0c;Red Hat 都建議將 SELinux 設為 enforcing 模式&#xff0c;因為它在關…

html文件怎么導出stl文件,各種3D建模軟件導出STL文件的小技巧(一)

很多用戶在提交3D模型文件的時候&#xff0c;常常有這樣的困惑&#xff1a;什么是STL 格式文件&#xff0c;怎么獲取STL 格式文件呢&#xff1f;STL 格式文件是在計算機圖形應用系統中&#xff0c;用于表示三角形網格的一種文件格式。它也是3D打印機在執行3D打印程序時&#xf…

angularjs 中的scope繼承關系——(2)

轉自&#xff1a;http://www.lovelucy.info/understanding-scopes-in-angularjs.html angularjs 中的scope繼承關系 ng-include 假設在我們的 controller 中&#xff0c; $scope.myPrimitive 50; $scope.myObject {aNumber: 11}; HTML 為&#xff1a; <script type&quo…

C# DatatTable某一列是否有重復判斷

public bool HasRepeatData(DataTable dt,string[] colName) { bool flagfalse; DataView myDataView new DataView(dt); if (myDataView.ToTable(true, colName).Rows.Count < dt.Rows.Count) { flag true; } return flag; }轉載于:https://www.cnblogs.com/clj0102/p/93…

cordova 項目添加splash啟動界面

需求&#xff1a;cordova項目啟動添加啟動界面&#xff0c;并在設備初始化完成后自動隱藏splash1.新建項目cordova create Mypro com.test.pro proName2.添加平臺cd Mypro&#xff08;進入目錄&#xff09;cordova platform add androidcordova platform add iOS3.添加splash插…

遼寧大學計算機專業接收調劑,目前有計算機專業調劑通知的學校,不斷更新—3月26日更新,新增遼寧大學等...

本帖最后由 yunnyforo 于 2012-3-26 21:16 編輯注&#xff1a;我對研究所關注度不高&#xff0c;關于研究所的調劑通知可能不及時&#xff0c;見諒。大家可以關注中國教育在線考研調劑信息站&#xff1a;http://kaoyan.eol.cn/html/ky/tiaoji/index.shtml&#xff0c;個人感覺這…

Android界面菜單(4)—快捷菜單

2019獨角獸企業重金招聘Python工程師標準>>> 快捷菜單 當用戶點擊界面上某個元素超過2秒后&#xff0c;將啟動注冊到該界面的快捷菜單。 步驟&#xff1a; 1.代碼動態生成菜單 final static int CONTEXT_MENU_1 Menu.FIRST;final static int CONTEXT_MENU_2 Menu…

Echarts地圖編寫

1.引入echarts庫文件 <script charset"utf-8" type"text/javascript" language"javascript" src"echarts-2.2.7/doc/example/www/js/echarts.js"></script> 2.在頁面中新建div用于地圖展示 <div id"main" st…

迷宮游戲 堆棧實現

#include<iostream> #include<string> #include<stack> using namespace std; #define n 8stack <int *> s;int * createMaze(){//初始化迷宮int i,j;int * a;anew int[n*n];for(i0;i<n;i){for(j0;j<n;j){*(an*ij)-1;//不設置為0的原因是超過矩陣…

威海職業學院計算機專業宿舍,2021年威海職業學院新生宿舍條件和宿舍環境圖片...

每年高考結束后&#xff0c;威海職業學院新生被錄取同學們陸續都到校報到~而宿舍作為同學們朝夕相處之場所&#xff0c;如果不懂相處之道&#xff0c;難免會摩擦不斷&#xff0c;更有甚者堪比宮斗大戲。所以各位大學新生一定要珍惜室友之間的友情&#xff0c;彼此處好關系。本文…

PostgreSQL 函數調試、診斷、優化 auto_explain

PostgreSQL 函數調試 & auto_explain 作者 digoal 日期 2016-11-21 標簽 PostgreSQL , pldebugger , 函數調試 , auto_explain 背景 PostgreSQL的服務端編程能力比較強&#xff0c;不僅支持像java, R, python這種流行的編程語言&#xff0c;另外還內置了一個與Oracle plsql…

判斷請求來自手機還是PC

由于小程序和PC端用的是同一個后臺 所以就需要判斷請求是從哪里發過來的 在這里是利用Request Body 里面的user-agent 來判斷 /** * 根據當前請求的特征&#xff0c;判斷該請求是否來自手機終端&#xff0c;主要檢測特殊的頭信息&#xff0c;以及user-Agent這個header * * pa…

小旭的互聯網營銷之微信營銷

11月1日&#xff0c;一篇題為《什么樣的女黑客竟遭馬云強東在雙11聯手封殺?》的文章&#xff0c;借助雙11火熱的關注效應&#xff0c;在短短兩天時間內刷爆朋友圈。 該文章的女主角不僅外表靚麗&#xff0c;黑客技術更是驚艷&#xff1a;“作為美籍華人的Joanna在2015黑帽子會…

計算機專業錄取分數及大學排名,計算機專業錄取分數最高的大學有哪些?附排名前50大學名單...

高考結束之后&#xff0c;不少即將迎接高考的家長對于很多專業的錄取情況都抱有很大的興趣&#xff0c;都比較關心自己的理想專業大概能上哪些大學。今天&#xff0c;小編將為大家以山東高考計算機專業各大學錄取分數進行排名&#xff0c;供下一屆高考生參考。計算機專業作為近…

letsencrypt 自動續期不關閉nginx

為什么80%的碼農都做不了架構師&#xff1f;>>> 已失效 corntab -e 5 0 1 * * /opt/letsencrypt/letsencrypt-auto --config /etc/letsencrypt/webroot.ini -d <domain> certonly && sudo service nginx reload/etc/letsencrypt/webroot.ini rsa-key…

loss低但精確度低_低光照圖像增強網絡-RetinexNet(model.py解析【2】)

論文地址&#xff1a;https://arxiv.org/pdf/1808.04560.pdf代碼地址&#xff1a;https://github.com/weichen582/RetinexNet解析目錄&#xff1a;https://zhuanlan.zhihu.com/p/88761829整個模型架構被實現為一個類&#xff1a;class lowlight_enhance(object):其構造函數實現…

計算機應用發表論文,計算機應用論文發表.docx

計算機應用論文發表1在工程項目管理中應用計算機技術存在的問題計算機軟件是計算機運行的重要保障&#xff0c;一個好的計算機軟件直接決定計算機技術在工程項目管理的高效應用。但由于市場上計算機軟件種類繁多&#xff0c;質量好壞不一&#xff0c;質量好的價格高&#xff0c…

添加dubbo xsd的支持

使用dubbo時遇到問題&#xff1a; org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document http://code.alibabatech.com/schema/dubbo/dubbo.xsd, because 1) could not find the document; 2) the document could not be read; 3) the root ele…