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

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

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

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

C語言程序的動(dòng)態(tài)內(nèi)存中棧內(nèi)存區(qū)域的概念

電子工程師 ? 來源:?jiǎn)纹瑱C(jī)匠人 ? 作者:蔡琰老師 ? 2021-06-29 10:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

C語言程序的動(dòng)態(tài)內(nèi)存分為棧內(nèi)存區(qū)域和堆內(nèi)存區(qū)域兩種。棧內(nèi)存是由編譯器管理的,而堆內(nèi)存是由程序調(diào)用具體的庫函數(shù)管理的。我們今天分析下棧內(nèi)存的概念。

棧內(nèi)存的使用在很大程度上依賴于處理器的硬件機(jī)制。在處理器中,一般有一個(gè)寄存器來表示當(dāng)前棧指針的位置,通常在內(nèi)存中分配一塊區(qū)域,這塊內(nèi)存的上界(高內(nèi)存地址)和下界(低內(nèi)存地址)之間是可用的棧內(nèi)存區(qū)域。

棧指針是一個(gè)指向棧區(qū)域內(nèi)部的指針,也就是它的值是一個(gè)地址,這個(gè)地址位于棧區(qū)的下界和棧區(qū)的上界之間。棧指針把這個(gè)棧區(qū)域分為兩個(gè)部分,一個(gè)是已經(jīng)使用的區(qū)域,一個(gè)是沒有使用的區(qū)域。

對(duì)于棧內(nèi)存的增長(zhǎng)方向有兩種:一種是向上增長(zhǎng)的,也就是低地址向高地址增長(zhǎng);另一個(gè)是向下增長(zhǎng)的,高地址向低地址增長(zhǎng)。在目前常見的體系結(jié)構(gòu)和編譯系統(tǒng)中,棧大多是向下增長(zhǎng)的,我們也是看下這種常見的增長(zhǎng)形式。在初始階段,棧指針是指向棧區(qū)間的上界。隨著棧使用量的增加,棧指針的值將向低地址移動(dòng),也就是在變小。

棧內(nèi)存在使用過程中有一個(gè)重要的特性是先入后出,也就是后入棧的內(nèi)容將先出棧,而先入棧的后出棧。類似于一個(gè)口的瓶子,先進(jìn)去的在底下,要想底下的出來就先把上面的先倒出來。

入棧的過程和出棧的過程我們安全用圖形來表示,更形象些吧~

在入棧的過程中,如果棧指針的變化超出棧內(nèi)存的區(qū)域,將發(fā)生棧溢出。

從圖中看出棧指針的功能是標(biāo)識(shí)當(dāng)前的棧位置。對(duì)棧內(nèi)存處理中,每次能夠獲取的內(nèi)容都是最后可放入棧內(nèi)存的內(nèi)容,而每次放入棧內(nèi)存中的內(nèi)容都將位于棧區(qū)域的最后。

總的來說其實(shí)棧是一個(gè)先入后出的內(nèi)存區(qū)域,棧指針是提供一種硬件的內(nèi)存機(jī)制。

還有一個(gè)大家可能都沒聽說過,或者都沒關(guān)注過的,我們來一起了解一下,就是滿棧和空棧的概念,我們還是通過圖來形容一下,這個(gè)是由處理器的體系結(jié)構(gòu)決定的。與程序的編寫沒有關(guān)系,甚至編譯器都不需要關(guān)注這個(gè)問題。無論在哪種情況下,棧指針都是已經(jīng)使用的棧區(qū)域和未使用的棧區(qū)域的分界線。

在滿棧的情況:棧指針當(dāng)前的位置是已經(jīng)使用的棧區(qū)域。

在空棧的情況:棧指針當(dāng)期的位置是沒有使用的棧區(qū)域。

這個(gè)僅供大家了解下就可以了,畢竟對(duì)于我們大多數(shù)人來說都是應(yīng)用者,多了解點(diǎn)底層的總沒錯(cuò),但也不必太深挖。對(duì)于棧內(nèi)存的概念我就分享到這里,其實(shí)這個(gè)對(duì)于寫匯編的人來說就很有用處了,或者去多讀一些匯編就很能清楚棧內(nèi)存的妙用了。

后續(xù)我分享堆內(nèi)存的一些概念,話說知識(shí)是一點(diǎn)點(diǎn)積累的過程,有時(shí)候覺得前面有的知識(shí)點(diǎn)懵懵懂懂的突然連起來就又通透了。這就是堅(jiān)持學(xué)習(xí)的作用,希望大家都能堅(jiān)持多學(xué),才能更會(huì)用。

編輯:jq

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

    關(guān)注

    183

    文章

    7644

    瀏覽量

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

    關(guān)注

    117

    文章

    3846

    瀏覽量

    85232

原文標(biāo)題:C語言中的動(dòng)態(tài)內(nèi)存-----棧內(nèi)存

文章出處:【微信號(hào):gh_e7f294a514ca,微信公眾號(hào):?jiǎn)纹瑱C(jī)匠人】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    容易造成單片機(jī)內(nèi)存溢出的幾個(gè)陷阱介紹

    關(guān)于程序變量和內(nèi)存分配,都是需要我們時(shí)刻關(guān)注的問題。我相信有不少人在這塊犯過很多的錯(cuò)誤,也可能說明我們基礎(chǔ)不夠扎實(shí),編寫程序的習(xí)慣也不夠好。 總結(jié)一下關(guān)于程序的變量和
    發(fā)表于 01-23 07:25

    keilc語言動(dòng)態(tài)分配內(nèi)存

    C程序,通常將內(nèi)存劃分為以下六個(gè)區(qū)域: (1)內(nèi)核區(qū)域。這塊
    發(fā)表于 01-21 06:04

    【「Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)」閱讀體驗(yàn)】+讀深入理解Linux內(nèi)核內(nèi)存分配

    成內(nèi)核空間和用戶空間,32位系統(tǒng)的內(nèi)核地址空間有低端與高端之分。部分內(nèi)存可以直接由內(nèi)核訪問,稱為低端內(nèi)存;而內(nèi)存未被永久映射覆蓋的部分稱
    發(fā)表于 01-16 20:05

    C語言嵌入式系統(tǒng)編程注意事項(xiàng)-內(nèi)存操作

    技巧。掌握并深入理解關(guān)于數(shù)據(jù)指針、函數(shù)指針、動(dòng)態(tài)申請(qǐng)內(nèi)存、const及volatile關(guān)鍵字等的相關(guān)知識(shí),是一個(gè)優(yōu)秀的C語言程序設(shè)計(jì)師的基本
    發(fā)表于 01-04 07:31

    嵌入式C語言中各變量存儲(chǔ)位置

    C語言程序,對(duì)變量的使用還有以下幾點(diǎn)需要注意 1. 體定義的變量通常是在上,不需要在
    發(fā)表于 12-25 07:54

    三種類型內(nèi)存的使用

    自動(dòng)存儲(chǔ):用于保存局部變量。當(dāng)函數(shù)被調(diào)用時(shí),就會(huì)創(chuàng)建一個(gè)新的自動(dòng)存儲(chǔ)區(qū)域,并在函數(shù)返回結(jié)果時(shí)刪除。只有返回值會(huì)被保留,并被復(fù)制到調(diào)用它的函數(shù)的自動(dòng)存儲(chǔ)。這意味著,返回一個(gè)指向局部變量的指針是不安全
    發(fā)表于 12-12 06:43

    C語言內(nèi)存池使用

    C語言內(nèi)存管理,從來都是一個(gè)讓人頭禿的問題。要想更自由地管理內(nèi)存,就必須去堆申請(qǐng),然后還需要考慮何時(shí)釋放,萬一釋放不當(dāng),或者沒有及時(shí)釋放
    發(fā)表于 12-11 07:57

    C語言的編程技巧

    一個(gè)成員是一個(gè)未知大小的數(shù)組,適用于動(dòng)態(tài)分配內(nèi)存并關(guān)聯(lián)一個(gè)可變長(zhǎng)度的數(shù)組。? ?3、匿名結(jié)構(gòu)體和聯(lián)合體?:C語言允許在結(jié)構(gòu)體或聯(lián)合體定義不
    發(fā)表于 11-27 06:46

    為什么單片機(jī)很少使用malloc,而PC程序頻繁使用呢?

    對(duì)程序的影響。 操作系統(tǒng)的支持單片機(jī):在許多單片機(jī)應(yīng)用程序運(yùn)行不依賴于復(fù)雜的操作系統(tǒng),而是基于裸機(jī)或輕量級(jí)實(shí)時(shí)操作系統(tǒng)(RTOS)來進(jìn)行管理。裸機(jī)系統(tǒng)往往沒有內(nèi)存管理單元(MMU
    發(fā)表于 11-20 06:55

    靈活高效ZBUFF — C內(nèi)存數(shù)據(jù)操作庫:優(yōu)化內(nèi)存管理的利器

    C語言開發(fā),高效的內(nèi)存管理是提升程序性能的關(guān)鍵。ZBUFF作為一款靈活高效的內(nèi)存數(shù)據(jù)操作庫,
    的頭像 發(fā)表于 08-14 18:01 ?691次閱讀
    靈活高效ZBUFF — <b class='flag-5'>C</b><b class='flag-5'>內(nèi)存</b>數(shù)據(jù)操作庫:優(yōu)化<b class='flag-5'>內(nèi)存</b>管理的利器

    靈活高效雙引擎驅(qū)動(dòng):ZBUFF讓C語言內(nèi)存操作更智能!

    高性能系統(tǒng)。 一、ZBUFF核心庫常用函數(shù) 如果小伙伴們此前沒有接觸過C語言或者不精通C語言,把ZBUFF核心庫當(dāng)成新庫來學(xué)習(xí)即可,建議先從熟悉相關(guān)函數(shù)的功能及其參數(shù)意義入手。 感興趣
    的頭像 發(fā)表于 08-11 13:27 ?589次閱讀
    靈活高效雙引擎驅(qū)動(dòng):ZBUFF讓<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內(nèi)存</b>操作更智能!

    IEC61508系統(tǒng)動(dòng)態(tài)內(nèi)存使用

    IEC 61508標(biāo)準(zhǔn)強(qiáng)烈推薦使用靜態(tài)內(nèi)存管理方式。在安全應(yīng)用設(shè)計(jì),我們都在遵循這個(gè)建議。
    的頭像 發(fā)表于 04-11 15:17 ?1393次閱讀
    IEC61508系統(tǒng)<b class='flag-5'>中</b>的<b class='flag-5'>動(dòng)態(tài)內(nèi)存</b>使用

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

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

    C語言中結(jié)構(gòu)體與聯(lián)合體的深度解析:內(nèi)存布局與應(yīng)用場(chǎng)景

    一、基礎(chǔ)概念與核心差異 1.1 結(jié)構(gòu)體(Struct)的本質(zhì) **結(jié)構(gòu)體是C語言中實(shí)現(xiàn)數(shù)據(jù)封裝的基石,其核心特征在于內(nèi)存獨(dú)立性。每個(gè)成員變量在內(nèi)存
    發(fā)表于 04-08 09:18

    快速搞懂C語言程序內(nèi)存分區(qū)!

    程序運(yùn)行過程,操作系統(tǒng)會(huì)根據(jù)程序的需要,將內(nèi)存劃分為多個(gè)功能不同的區(qū)段,以便更高效地管理內(nèi)存資源和確保
    的頭像 發(fā)表于 03-14 17:37 ?1565次閱讀
    快速搞懂<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>程序</b><b class='flag-5'>內(nèi)存</b>分區(qū)!