在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

動態內存分配的注意事項及本質是什么

C語言編程學習基地 ? 來源:華為云社區 ? 作者:G-washington ? 2021-10-13 15:37 ? 次閱讀

C語言中比較重要的就是指針,它可以用來鏈表操作,談到鏈表,很多時候為此分配內存采用動態分配而不是靜態分配。

本文分享自華為云社區《 【云駐共創】C語言中動態內存分配的本質 》,作者:G-washington

C語言是一門面向過程的、抽象化的通用程序設計語言,廣泛應用于底層開發。盡管C語言提供了許多低級處理的功能,但仍然保持著跨平臺的特性,因為C語言具有可移植性,可拓展性,可重用性等特性,促使C語言仍然在編程語言排行榜上占據一定有利地位。而C語言中比較重要的就是指針,它可以用來鏈表操作,談到鏈表,很多時候為此分配內存采用動態分配而不是靜態分配。

內存分配的概念

通常定義變量(或對象),編譯器在編譯時都可以根據該變量(或對象)的類型知道所需內存空間的大小,從而系統在適當的時候為他們分配確定的存儲空間。這種內存分配稱為靜態存儲分配;

有些操作對象只在程序運行時才能確定,這樣編譯時就無法為他們預定存儲空間,只能在程序運行時,系統根據運行時的要求進行內存分配,這種方法稱為動態存儲分配。所有動態存儲分配都在堆區中進行。

內存不是取之不盡用之不竭,4g、8g、16g是常見的電腦內存大小,打開任務管理器,能看到不同的應用占據的內存情況。如果一個應用程序占了大部分內存,估計別的應用就資源緊張了,那這個應用可能會被卸載,找個節省內存的。

內存管理是計算機接近物理本質的操作,那些程序語言之下的動作,最終都要調動內存來實現。系統的資源不是無限的,系統上運行的程序也不是只有這一個,忽略內存,就會設計出危險的、冗余的代碼產品,或者沒法更好的交互。

動態內存分配的特點

動態內存是相對靜態內存而言的。所謂動態和靜態就是指內存的分配方式。動態內存是指在堆上分配的內存,而靜態內存是指在棧上分配的內存。動態內存分配的本質就是,什么時候需要一塊內存的時候,再分配這塊內存;當不再需要某一塊內存的時候,就可以把這塊內存釋放掉。這種靈活的內存分配方式,正好適合鏈表這種數據結構。

傳統數組的缺點

數組與動態內存分配相比有以下缺點:

數組的長度必須事先指定,而且只能是常量,不能是變量。

因為數組長度只能是常量,所以它的長度不能在函數運行的過程當中動態地擴充和縮小。

對于數組所占內存空間程序員無法手動編程釋放,只能在函數運行結束后由系統自動釋放,所以在一個函數中定義的數組只能在該函數運行期間被其他函數使用。

而“傳統數組”的問題,實際上就是靜態內存的問題。但是動態內存就不存在這個問題,因為動態內存是由程序員手動編程釋的,所以想什么時候釋放就什么時候釋放。只要程序員不手動編程釋放,就算函數運行結束,動態分配的內存空間也不會被釋放,其他函數仍可繼續使用它。除非是整個程序運行結束,這時系統為該程序分配的所有內存空間都會被釋放。

動態內存的申請與釋放

動態內存的申請與釋放主要依靠兩個函數malloc和free。malloc 是一個系統函數,它是 memory allocate 的縮寫。其中memory是“內存”的意思,allocate是“分配”的意思。顧名思義 malloc 函數的功能就是“分配內存”,要調用它必須要包含頭文件《stdlib.h》。

malloc()函數會向堆中申請一片連續的可用內存空間;若申請成功 ,,返回指向這片內存空間的指針 ,若失敗 ,則會返回NULL, 所以我們在用malloc()函數開辟動態內存之后, 一定要判斷函數返回值是否為NULL;返回值的類型為void*型, malloc()函數并不知道連續開辟的size個字節是存儲什么類型數據的 ,所以需要我們自行決定 ,方法是在malloc()前加強制轉 ,轉化成我們所需類型 ,如: (int*)malloc(sizeof(int)*n)。

下面使用 malloc 函數寫一個程序,程序的功能是:調用被調函數,將主調函數中動態分配的內存中的數據放大 10 倍。

249605c0-2bf7-11ec-82a8-dac502259ad0.png

輸出結果是:*p = 100

free是釋放函數,在堆中申請的內存空間不會像在棧中存儲的局部變量一樣 ,函數調用完會自動釋放內存 , 如果我們不手動釋放, 直到程序運行結束才會釋放, 這樣就可能會造成內存泄漏, 即堆中這片內存中的數據已經不再使用, 但它一直占著這片空間, 所以當我們申請的動態內存不再使用時 ,一定要及時釋放 。不過需要注意的是,釋放并不是指清空內存空間,而是指將該內存空間標記為“可用”狀態,使操作系統在分配內存時可以將它重新分配給其他變量使用。

那么,當指針變量被釋放后,它所指向的內存空間中的數據會怎樣呢?free 的標準行為只是表示這塊內存可以被再分配,至于它里面的數據是否被清空并沒有強制要求。不同的編譯器處理的方式可能不一樣。我們就看一下 VC++6.0 這個編譯器是怎么處理的:

252281da-2bf7-11ec-82a8-dac502259ad0.png

可見在 VC++6.0 中,當指針變量被釋放后,雖然它仍然是指向那個內存空間的,但那個內存空間中的值將會被重新置一個非常小的負數。動態創建的內存如果不用了必須要釋放。注意,一個動態內存只能釋放一次。如果釋放多次程序就會崩潰,因為已經釋放了,不能再釋放第二次。

綜上所述,malloc 和 free 一定要成對存在,一一對應。有 malloc 就一定要有 free,有幾個 malloc 就要有幾個 free,與此同時,每釋放一個指向動態內存的指針變量后要立刻把它指向 NULL。

注意事項

1)釋放一塊內存的一部分是不允許的。動態分配的內存必須整塊一起釋放。但是,realloc函數可以縮小一塊動態分配的內存,有效地釋放它尾部的部分內存。

2)不要訪問已經被free函數釋放了的內存。假定對一個指向動態分配的內存的指針進行了復制,而且這個指針的幾份拷貝分散于程序各處。你無法保證當你使用其中一個指針時它所指向的內存是不是已被另一個指針釋放。還要確保程序中所有使用這塊內存的地方在這塊內存釋放之前停止對它的使用。

3)當動態分配的內存不再需要使用時,應該被釋放,這樣可以被重新分配使用。分配內存但在使用完畢后不釋放將引起內存泄漏(memory leak)。

今天的分享就到這里了,大家要好好學C++喲~

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7616

    瀏覽量

    137929
  • 程序
    +關注

    關注

    117

    文章

    3798

    瀏覽量

    81481
  • 函數
    +關注

    關注

    3

    文章

    4349

    瀏覽量

    63033
  • 代碼
    +關注

    關注

    30

    文章

    4841

    瀏覽量

    69166
  • 動態內存
    +關注

    關注

    1

    文章

    24

    瀏覽量

    8013

原文標題:C語言核心基礎知識:動態內存分配的本質是什么?

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    智多晶DDR Controller使用注意事項

    最后一期我們主要介紹智多晶DDR Controller使用時的注意事項
    的頭像 發表于 01-24 11:14 ?258次閱讀
    智多晶DDR Controller使用<b class='flag-5'>注意事項</b>

    多層板埋孔設計注意事項

    多層板埋孔設計注意事項
    的頭像 發表于 12-20 16:06 ?305次閱讀

    PCBA生產注意事項

    ? ?PCBA生產注意事項。 長按識別二維碼關注[現代電子裝聯工藝技術]訂閱號,開啟我們共同的學習之旅 end
    的頭像 發表于 11-15 17:04 ?512次閱讀
    PCBA生產<b class='flag-5'>注意事項</b>

    如何為住宅配置靜態IP:步驟與注意事項

    為住宅配置靜態IP地址,通常涉及以下步驟和注意事項
    的頭像 發表于 10-24 08:02 ?374次閱讀

    脈沖式充電器的使用注意事項

    脈沖式充電器的使用注意事項主要包括以下幾個方面: 一、安全注意事項 用電安全 :在充電過程中,應始終保持警惕,注意用電安全,避免觸電和短路等危險情況的發生。 防火防災 :避免在易燃易爆物品附近進行
    的頭像 發表于 09-26 16:05 ?1187次閱讀

    繞線電感定制的注意事項

    電子發燒友網站提供《繞線電感定制的注意事項.docx》資料免費下載
    發表于 09-20 11:24 ?0次下載

    內幕揭秘:電流檢測放大器的滿量程和動態范圍注意事項

    電子發燒友網站提供《內幕揭秘:電流檢測放大器的滿量程和動態范圍注意事項.pdf》資料免費下載
    發表于 09-12 09:11 ?0次下載
    內幕揭秘:電流檢測放大器的滿量程和<b class='flag-5'>動態</b>范圍<b class='flag-5'>注意事項</b>

    共模電感定制的注意事項

    電子發燒友網站提供《共模電感定制的注意事項.docx》資料免費下載
    發表于 09-04 11:47 ?0次下載

    LiFePO4設計注意事項

    電子發燒友網站提供《LiFePO4設計注意事項.pdf》資料免費下載
    發表于 09-03 09:24 ?0次下載
    LiFePO4設計<b class='flag-5'>注意事項</b>

    現場總線的使用方法與注意事項

    的穩定可靠運行,正確的使用方法和注意事項至關重要。本文將詳細介紹現場總線的使用方法和注意事項,以供讀者參考。
    的頭像 發表于 06-06 11:49 ?916次閱讀

    FMD LINK 使用注意事項

    電子發燒友網站提供《FMD LINK 使用注意事項.pdf》資料免費下載
    發表于 05-06 10:11 ?0次下載

    你知道嗎? 51單片機也有動態內存分配

    一、簡述其實在51單片機中也可以使用動態內存動態內存其實就是劃出一塊內存區域,將這塊內存進行管理,稱為內存管理。51單片機可以使用c語言自
    的頭像 發表于 04-26 08:10 ?1690次閱讀
    你知道嗎? 51單片機也有<b class='flag-5'>動態內存</b><b class='flag-5'>分配</b>

    家用路由器的使用技巧和注意事項**

    家用路由器使用技巧包括合理放置、定期重啟、設置強密碼、設置訪客網絡、更新固件、啟用雙頻網絡和設置家長控制。注意事項包括避免過度擁擠、防止過度疲勞、防止遮擋信號、定期檢查網絡設備、保護隱私信息、避免惡意攻擊和避免強度過高的信號。遵循這些技巧和注意事項,可以提高家庭網絡的連接
    的頭像 發表于 03-21 17:37 ?946次閱讀

    EMI / Safety觀念簡介及注意事項

    電子發燒友網站提供《EMI / Safety觀念簡介及注意事項.ppt》資料免費下載
    發表于 02-28 09:45 ?1次下載

    C語言中的動態內存管理講解

    本章將講解 C 中的動態內存管理。C 語言為內存分配和管理提供了幾個函數。這些函數可以在 頭文件中找到。
    的頭像 發表于 02-23 14:03 ?446次閱讀
    C語言中的<b class='flag-5'>動態內存</b>管理講解
    主站蜘蛛池模板: 日本三级网站在线观看 | 99色视频在线观看 | 天天翘夜夜洗澡天天做 | 亚洲a在线观看 | 人人干人人干 | 久久久久久久久久久观看 | 夜夜夜夜夜夜夜猛噜噜噜噜噜噜 | 五月婷婷在线播放 | 69xxxx欧美老师| 欧美日韩性高爱潮视频 | 国产久热精品 | 欧美色图在线观看 | 亚洲色啦啦狠狠网站 | 亚洲伊人99综合网 | 色偷偷免费视频 | 免费看曰批女人爽的视频网址 | 久久夜色精品国产亚洲 | 国产午夜视频在线观看第四页 | 日本人xxxxxxxxxⅹ68 | 成人伊人青草久久综合网 | 日本天天射| 亚洲色图欧美色 | 欧美天堂在线观看 | 精品综合久久久久久98 | 天天躁狠狠躁狠狠躁夜夜躁 | you ji z z日本人在线观看 | 欧美日韩一区二区三区视视频 | 加勒比精品视频 | 激情综合视频 | 免费永久视频 | 婷婷色天使在线视频观看 | 午夜宅男视频 | 欧美高清a | 国产亚洲卡二卡3卡4卡乱码 | 伊人色综合久久天天爱 | 乱色伦肉小说 | 99久久婷婷免费国产综合精品 | 色天天干 | 手机看片www xiao2b cm | 天天撸视频 | 乡村乱人伦短小说 |