91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

動態(tài)內(nèi)存分配的注意事項及本質(zhì)是什么

C語言編程學(xué)習基地 ? 來源:華為云社區(qū) ? 作者:G-washington ? 2021-10-13 15:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

本文分享自華為云社區(qū)《 【云駐共創(chuàng)】C語言中動態(tài)內(nèi)存分配的本質(zhì) 》,作者:G-washington

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

內(nèi)存分配的概念

通常定義變量(或?qū)ο螅?,編譯器在編譯時都可以根據(jù)該變量(或?qū)ο螅┑念愋椭浪鑳?nèi)存空間的大小,從而系統(tǒng)在適當?shù)臅r候為他們分配確定的存儲空間。這種內(nèi)存分配稱為靜態(tài)存儲分配;

有些操作對象只在程序運行時才能確定,這樣編譯時就無法為他們預(yù)定存儲空間,只能在程序運行時,系統(tǒng)根據(jù)運行時的要求進行內(nèi)存分配,這種方法稱為動態(tài)存儲分配。所有動態(tài)存儲分配都在堆區(qū)中進行。

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

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

動態(tài)內(nèi)存分配的特點

動態(tài)內(nèi)存是相對靜態(tài)內(nèi)存而言的。所謂動態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存。動態(tài)內(nèi)存分配的本質(zhì)就是,什么時候需要一塊內(nèi)存的時候,再分配這塊內(nèi)存;當不再需要某一塊內(nèi)存的時候,就可以把這塊內(nèi)存釋放掉。這種靈活的內(nèi)存分配方式,正好適合鏈表這種數(shù)據(jù)結(jié)構(gòu)。

傳統(tǒng)數(shù)組的缺點

數(shù)組與動態(tài)內(nèi)存分配相比有以下缺點:

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

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

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

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

動態(tài)內(nèi)存的申請與釋放

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

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

下面使用 malloc 函數(shù)寫一個程序,程序的功能是:調(diào)用被調(diào)函數(shù),將主調(diào)函數(shù)中動態(tài)分配的內(nèi)存中的數(shù)據(jù)放大 10 倍。

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

輸出結(jié)果是:*p = 100

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

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

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

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

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

注意事項

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

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

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

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

編輯:jq

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

    關(guān)注

    183

    文章

    7644

    瀏覽量

    145570
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3846

    瀏覽量

    85232
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4417

    瀏覽量

    67501
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4967

    瀏覽量

    73960
  • 動態(tài)內(nèi)存
    +關(guān)注

    關(guān)注

    1

    文章

    25

    瀏覽量

    8241

原文標題:C語言核心基礎(chǔ)知識:動態(tài)內(nèi)存分配的本質(zhì)是什么?

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學(xué)習基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    keil中c語言的動態(tài)分配內(nèi)存

    。 由于上述兩種情況,該函數(shù)在使用時就需要注意,看下面的代碼: 在使用realloc時我們要注意上述代碼中隱藏的風險。 2.常見的動態(tài)內(nèi)存分配錯誤
    發(fā)表于 01-21 06:04

    請問CW32F030的硬件注意事項有哪些?

    CW32F030的硬件注意事項有哪些
    發(fā)表于 12-25 08:20

    請問IAP功能升級流程中有哪些注意事項

    IAP 功能升級流程中有哪些注意事項
    發(fā)表于 12-23 07:55

    迅為RK3588開發(fā)板Android系統(tǒng)燒寫及注意事項

    迅為RK3588開發(fā)板Android系統(tǒng)燒寫及注意事項
    的頭像 發(fā)表于 12-03 15:17 ?7163次閱讀
    迅為RK3588開發(fā)板Android系統(tǒng)燒寫及<b class='flag-5'>注意事項</b>

    驅(qū)動板PCB布線的注意事項

    PCB Layout 注意事項 1)布局注意事項: ●● 整體布局遵循功率回路與小信號控制回路分開布局原則,功率部分和控制部分的 GND 分開回流到輸入 GND。 ●● 芯片的放置方向優(yōu)先考慮驅(qū)動
    發(fā)表于 12-02 07:40

    CW32F030在使用中的注意事項有哪些?

    CW32F030在使用中的注意事項有哪些?
    發(fā)表于 11-18 06:20

    emWin AppWizard 開發(fā)注意事項有哪些?

    emWin AppWizard 開發(fā)注意事項
    發(fā)表于 09-04 06:18

    別讓這些細節(jié)毀了PCBA!焊接注意事項清單

    一站式PCBA加工廠家今天為大家講講PCBA加工中電子元器件焊接注意事項有哪些?PCBA加工中電子元器件焊接注意事項。 電子元器件焊接關(guān)鍵注意事項 在PCBA加工中,焊接工藝直接影響電路板的可靠性
    的頭像 發(fā)表于 07-23 09:26 ?1200次閱讀

    美國Odyssey奧德賽電池充電注意事項全解析

    Odyssey奧德賽電池充電注意事項全解析 奧德賽電池作為高性能的深循環(huán)鉛酸電池,廣泛應(yīng)用于汽車啟動、摩托車、船舶以及備用電源系統(tǒng)中。正確的充電方法不僅能夠延長電池壽命,還能保障其性能穩(wěn)定發(fā)揮
    的頭像 發(fā)表于 05-19 16:31 ?1088次閱讀
    美國Odyssey奧德賽電池充電<b class='flag-5'>注意事項</b>全解析

    IGBT器件的防靜電注意事項

    IGBT作為功率半導(dǎo)體器件,對靜電極為敏感。我將從其靜電敏感性原理入手,詳細闡述使用過程中防靜電的具體注意事項與防護措施,確保其安全穩(wěn)定運行。
    的頭像 發(fā)表于 05-15 14:55 ?1815次閱讀

    設(shè)置射頻網(wǎng)絡(luò)分析儀的測試條件有哪些注意事項

    PNA-X的“Power Sweep”)確定線性工作區(qū)。 3. 中頻帶寬(IFBW) 注意事項: 窄IFBW(如1kHz)提升動態(tài)范圍但降低速度,寬IFBW(如100kHz)反之。 權(quán)衡原則: 噪聲敏感
    發(fā)表于 05-06 16:02

    錐齒輪減速機的使用安裝和維護維修注意事項

    錐齒輪減速機的使用、安裝和維護維修注意事項涵蓋了多個方面,以下是對這些注意事項的詳細歸納: 一、使用注意事項 1. 確認規(guī)格與設(shè)計相符:在使用減速機前,請先行確認購買的規(guī)格與設(shè)計規(guī)格是否相符。 2.
    的頭像 發(fā)表于 04-21 18:13 ?1266次閱讀
    錐齒輪減速機的使用安裝和維護維修<b class='flag-5'>注意事項</b>

    如何使用LAX_CODEGEN啟用動態(tài)內(nèi)存分配?

    我目前正在探索NXP_MBDToolbox_LAX。lax_codegen 生成的代碼基于靜態(tài)分配。我想管理大型向量,如何使用 LAX_CODEGEN 啟用動態(tài)內(nèi)存分配
    發(fā)表于 04-10 08:09

    掃描電鏡的日常維護有哪些注意事項?

    掃描電鏡日常維護的注意事項。
    的頭像 發(fā)表于 03-24 11:38 ?1170次閱讀
    掃描電鏡的日常維護有哪些<b class='flag-5'>注意事項</b>?

    依托raksmart服務(wù)器在多種系統(tǒng)上本地部署deepseek注意事項

    在RAKsmart服務(wù)器上本地部署DeepSeek時,需根據(jù)不同的操作系統(tǒng)和環(huán)境做好全面適配。以下是關(guān)鍵注意事項及分步指南,主機推薦小編為您整理發(fā)布依托raksmart服務(wù)器在多種系統(tǒng)上本地部署deepseek注意事項。
    的頭像 發(fā)表于 03-19 11:25 ?892次閱讀