最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言內存管理及初始化細節(jié)示例詳解

 更新時間:2022年02月14日 14:59:57   作者:喬喬家的龍龍  
這篇文章主要為大家介紹了C語言內存管理及初始化細節(jié)示例的詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

地址空間

在這里插入圖片描述

首先我們回味一下之前的老圖,這個圖由于是我手殘加 ppt 即時創(chuàng)作,又因為是C語言入門時講的,內容非常粗糙磕磣。要仔細研究這張圖我們應該將它翻轉90度會更加容易理解更貼近原理:

在這里插入圖片描述

我們所熟知的,棧區(qū)數(shù)據(jù)存儲的地址是從高地址到低地址,堆區(qū)數(shù)據(jù)存儲的地址則是由低到高,而堆區(qū)下面可細分為未初始化和已初始化的全局數(shù)據(jù)區(qū),字符常量區(qū)和代碼區(qū)。而細心的你可能注意到了我代碼區(qū)下面留了一撮空間代表下面還有,但這一撮屬于灰色地帶,目前看作為 “內存” ,但本質上不是內存,涉及到計算機操作系統(tǒng)原理不贅述。

從內存中0x000……0到堆區(qū)的地方其實基本上伴隨整個程序的運行一直都存在,我們相對熟悉的就是棧區(qū)和堆區(qū),棧區(qū)的我們函數(shù)調用后臨時變量在棧幀中形成,隨著申請與釋放來進行空間管理。

那伴隨整個程序的運行一直都存在的這部分數(shù)據(jù),像 static 這類函數(shù)修飾的變量,為什么又會被改變生命周期呢?其實在編譯的時候就被編譯進了全局數(shù)據(jù)區(qū)。

指針與內存關系

void function(char *a)
{
  return 1;
}

我們在寫函數(shù)時如果內容傳的是指針,如果有好的習慣一般會先去對指針做一下合法性判定,這個判定什么意思,比如我們傳了一個野指針,它會指向內存中任何一個位置,我是沒有辦法確認這個隨機位置有無訪問權限,所以要做合法性判定。

但是指針如果有具體的指向,對應的合法性我們是沒辦法驗證的,包括野指針,是不是很疑惑,野指針不是隨機指向,說白了就是亂指,那還沒辦法驗證嗎?是的,沒辦法。很簡單,確認指針具體值的合法性,這不是咱作為用戶可以做到的,這屬于操作系統(tǒng)職責。

這種尷尬的情況我們所謂的合法性判定怎么搞呢?我們所謂的“合法”是落足于應用層面。其實所有的指針在沒有被使用時,我們都應該設置成 NULL,這是一個規(guī)范問題。

在函數(shù)內部要驗證指針合法性時,本質上就是在驗證指針( !=NULL)。可以直接 if 判斷,還有就是很多書中用的一個檢查指針的宏——assert ,一般是在調試階段使用,assert(name)如果內部條件不滿足非空,就會直接咔嚓掉,中道崩殂沒有后續(xù)。但是不好意思,assert只能檢驗是否 NULL,不能檢驗是否為野指針。

內存分配與初始化細節(jié)

之前就想專門提一下幾個和內存空間有關聯(lián)的函數(shù),現(xiàn)在就放在這里一起總結了吧。

我們?yōu)橹羔樂峙淞藘却妫莾却娲笮《嗌贂绊憣嶋H結果,不夠就會造成越界。

char *p = "hello";
char *q = (char*)malloc(sizeof(char)*strlen(p)+1*sizeof(char));
strcpy(q,p);

在這里插入圖片描述

p是字符串變量,長度為 5 個字符,但實際內存占用 6 個字符,不要忘了" \0 ",所以我們做 +1 處理,分配完了記得要初始化,初始化為非必須操作,但建議初始化,這是為了能讓咱編碼盤的明明白白。我們初始化變量時直接 0 或者 NULL,數(shù)組可以 = {0},也可以使用 memset 函數(shù):

memset(a,0,sizeof(a));

它的 3 個參數(shù)分別代表起始地址,初始化設置的值以及設置的內存大小,單位為字節(jié)。

內存泄漏

int main()
{
while(1)
{
int *p = malloc(1024);
}
}

這里不做測試了,這會讓電腦越來越卡,死循環(huán)加申請空間,程序級別的老賴,空間只借不還,以上代碼就生動詮釋了何為內存泄漏。

給個C語言之外的問題:程序掛了,已經退出了,那內存泄露問題還在嗎?我自己的想法是在的,因為內存已經被申請了,退出程序只是終止了空間繼續(xù)申請,不影響已產生的空間。但是我錯了,其實在程序退出時,操作系統(tǒng)會強制拿回這部分空間,內存泄漏也就不在了。

所以諸位警惕windows的操作系統(tǒng)和殺毒軟件這類常駐進程,幾乎從來不會退出,最怕的就是內存泄漏,藍屏安排,卡頓安排;但后端的服務器也是如此,無時無刻提供服務,一但內存泄露就會嘿嘿。

Cookie

malloc 之后空間要給 free 掉,我們 free(p)目前只知道堆空間的起始地址,并不知道要釋放多少空間,如果 p 是 5 個字節(jié),那么 free 一定會釋放的比5個字節(jié)多,那么辯證思維,其實申請的空間就一定會比 5 個字節(jié)多。

編譯器是怎么做到正確釋放呢?其實實際 malloc 申請空間的時候,系統(tǒng)就會給的更多,多出來的部分,記錄的就是申請的詳細信息:空間大小,申請時間等等,free 會確認信息然后精準 free掉。

這部分多申請的空間叫 cookie,內存級的 cookie,就是用來保存這些信息的。再延伸就是C語言的邊界操作系統(tǒng)了,不贅述。

所以我們在 malloc 時肯定是申請大空間會更好,因為 cookie 的比例會更小,想象一下利息相同時你會借多借少就能體會了。

今天就到這里吧,摸了家人們,更多關于C語言內存管理初始化細節(jié)的資料請關注腳本之家其它相關文章!

相關文章

  • C++中關于std::queue?中遇到釋放內存錯誤的問題

    C++中關于std::queue?中遇到釋放內存錯誤的問題

    這篇文章主要介紹了std::queue中遇到釋放內存錯誤的問題,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • c++判斷是否為目錄的示例分享

    c++判斷是否為目錄的示例分享

    這篇文章主要介紹了c++判斷是否為目錄的示例,需要的朋友可以參考下
    2014-03-03
  • C++錯誤使用迭代器超出引用范圍問題及解決方案

    C++錯誤使用迭代器超出引用范圍問題及解決方案

    這篇文章主要介紹了C++錯誤使用迭代器超出引用范圍分析與解決,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • 如何基于C++解決RTSP取流報錯問題

    如何基于C++解決RTSP取流報錯問題

    這篇文章主要介紹了如何基于C++解決RTSP取流報錯問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • C語言中用于產生隨機數(shù)的函數(shù)使用方法總結

    C語言中用于產生隨機數(shù)的函數(shù)使用方法總結

    這篇文章主要介紹了C語言中用于產生隨機數(shù)的函數(shù)使用方法總結,分別介紹了rand()函數(shù)和srand()函數(shù)以及封裝出的arc4random()函數(shù),需要的朋友可以參考下
    2016-05-05
  • C語言打印各種圖案實例代碼

    C語言打印各種圖案實例代碼

    大家好,本篇文章主要講的是C語言打印各種圖案實例代碼,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C語言實現(xiàn)發(fā)送郵件功能

    C語言實現(xiàn)發(fā)送郵件功能

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)發(fā)送郵件功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 基于C語言實現(xiàn)五子棋游戲

    基于C語言實現(xiàn)五子棋游戲

    這篇文章主要為大家詳細介紹了基于C語言實現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C++實現(xiàn)的一個可以寫遞歸lambda的Y函數(shù)

    C++實現(xiàn)的一個可以寫遞歸lambda的Y函數(shù)

    這篇文章主要介紹了C++實現(xiàn)的一個可以寫遞歸lambda的Y函數(shù),在Y函數(shù)的幫助,這個lambda表達是可以成功看到自己,然后遞歸調用的,需要的朋友可以參考下
    2014-07-07
  • C語言詳解如何應用模擬字符串和內存函數(shù)

    C語言詳解如何應用模擬字符串和內存函數(shù)

    這篇文章主要介紹了C語言詳解如何應用模擬字符串和內存函數(shù),文章有點長,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02

最新評論

房山区| 大悟县| 莲花县| 云霄县| 庄浪县| 海林市| 阳山县| 北宁市| 枞阳县| 娱乐| 刚察县| 抚顺市| 龙胜| 莒南县| 会东县| 桐柏县| 禹州市| 澄城县| 文山县| 革吉县| 郎溪县| 黔西| 海林市| 安宁市| 友谊县| 金门县| 安塞县| 霞浦县| 潞西市| 勃利县| 湛江市| 德安县| 广饶县| 沙雅县| 海晏县| 皋兰县| 商都县| 徐汇区| 霍林郭勒市| 仪征市| 略阳县|