那曲檬骨新材料有限公司

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

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

3天內不再提示

const聲明的變量一定只能讀嗎?

魚鷹談單片機 ? 來源:魚鷹談單片機 ? 2023-10-07 09:23 ? 次閱讀

一直以為 const 聲明的變量一定是只讀的,并且也一定會存放在 FLASH 中,直到在 103 的 map 文件中看到了這個變量:

wKgaomUgsyCAVtmeAACXYb5Ah-M693.jpg

聲明如下(函數體外):

wKgZomUgsyGAQHEXAACMSPBygJ0689.jpg

__I 聲明如下:

wKgZomUgsyCAWdcnAACXF7CHJh4577.jpg

可以看到,雖然使用 const 修飾變量為只讀,但是 MDK 編譯器仍將這兩個數組放在了 RAM 區(全局變量),這意味著這個變量仍可寫(通過指針方式修改),只是不能直接修改而已,還白白浪費了 RAM 空間,因為從實現來看,根本不需要修改這個表,完全可以將其放入 FLASH 空間。

測試發現,是 volatile 這個關鍵字導致了這個現象,如果沒有這個關鍵字修飾,則能夠將其放入 FLASH 中,所以庫函數這個代碼也是挺迷的。

去除 volatile 修飾后(0x08xx xxxx 為 FLASH 地址區):

wKgZomUgsyGAXxrhAAEUB8_PCNw895.jpg

并且你以為這就完了?當將 const 聲明的數組放在函數體中,你會發現這個數組也被放在了 RAM ()區,而不是 FLASH,這樣你想節省棧空間的計劃就泡湯了。

wKgaomUgsyCAZId8AAFHv4g6qNA355.jpg

那該怎么辦?很簡單,加一個 static 即可:

wKgZomUgsyCAS6QcAAFJiGOd-Bo615.jpg

但是當你加上 volatile 后,又被放入 RAM 中了,并且這次不是在棧中,而是作為全局變量(map 文件可找)存在,占用了 RAM 的空間。

wKgaomUgsyGAMkmaAAFsNQjA4dM015.jpg

這算不大不小坑吧,望引以為戒!






審核編輯:劉清

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

    關注

    10

    文章

    1642

    瀏覽量

    148672
  • RAM
    RAM
    +關注

    關注

    8

    文章

    1369

    瀏覽量

    115002
  • CONST
    +關注

    關注

    0

    文章

    45

    瀏覽量

    8187

原文標題:坑!const 聲明的變量一定只能讀嗎?

文章出處:【微信號:emOsprey,微信公眾號:魚鷹談單片機】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    變量聲明和定義有什么區別和聯系

    變量聲明和定義是編程中的兩個重要概念,它們在語法和語義上有些區別和聯系。在本文中,我將詳細介紹變量聲明和定義之間的區別和聯系。 首先,
    的頭像 發表于 12-07 16:14 ?1192次閱讀

    請問如何防止tasking將const變量合并?

    編譯中發現tasking將const變量值相同的變量合并了,先去掉些優化選項還是不起作用,只能改變co
    發表于 02-02 08:07

    C語言之正確使用Const

    C語言之正確使用Const基本解釋  const個C語言的關鍵字,它限定變量不允許被改變。使用c
    發表于 10-07 11:20

    C和C++中const的用法比較

    地址,但是應該清楚引用在底層實現上也是通過傳遞地址的方式來進行的。當不得不為const變量分配空間時,C++仍然能通過一定的手段來盡量進行constant folding。如下代碼所示:con
    發表于 11-11 10:00

    C語言——正確使用const

    C語言——正確使用const基本解釋   const個C語言的關鍵字,它限定變量不允許被改變。使用
    發表于 04-23 11:58

    在while循環內添加了個全局變量。然后在當前vi的while循環外讀取全局變量只能讀

    在while循環內添加了個全局變量。然后在當前vi的while循環外讀取全局變量只能讀次,為什么啊。全局
    發表于 08-14 15:58

    labview 通過OPC modbus TCP 與施耐德258通訊 字能讀能寫 但是位只能讀不能寫

    沒問題,我都是確定能讀之后再轉入寫狀態。我是按照網上的教程去操作的。用400003.4對應PLC當中的%MX4.4中間變量。更換其他變量后,也是只能讀不能寫。不知道是怎么回事。有大神知
    發表于 10-20 11:00

    怎么更改const變量PIC18F47K40的值?

    嗨,我需要改變const數組變量的值。我必須聲明變量const,因為我需要使用的數組有47
    發表于 03-12 11:36

    Verilog 變量聲明與數據類型

    邏輯單元的輸出驅動。沒有連接驅動的wire型變量的值為高阻’z’。wire類型變量的使用:wire型變量聲明與賦值wire類型的變量
    發表于 08-10 14:01

    C語言中變量聲明和定義以及extern的用法介紹

    變量聲明不同于變量的定義,這點往往容易讓人混淆。 l變量聲明是告訴編譯器,該
    發表于 11-21 10:59 ?12次下載

    你會使用Linux編程const

    另外const些強大的功能在于它在函數聲明中的應用。在個函數聲明中,const 可以修飾
    發表于 05-06 16:34 ?574次閱讀
    你會使用Linux編程<b class='flag-5'>const</b>?

    從STM32到CONST的全局變量

    ? ?STM32的const全局變量地址 程序如下: const int globalConstDat = 12; int globalDat = 11; int main(void) { int
    的頭像 發表于 07-23 10:50 ?4944次閱讀

    怎樣去使用C語言中的const關鍵字呢

    我們會發現兩者的區別const個注釋的全局變量個注釋的局部變量,我們編譯都能通過,不過使用全部變量
    的頭像 發表于 08-12 09:13 ?1495次閱讀
    怎樣去使用C語言中的<b class='flag-5'>const</b>關鍵字呢

    const 和指針變量使用

    有時候我們希望定義這樣變量,它的值不能被改變,在整個作用域中都保持固定。例如,用變量來表示班級的最大人數,或者表示緩沖區的大小。為了滿足這
    的頭像 發表于 06-22 10:43 ?510次閱讀

    const 聲明變量一定是只讀的?

    雖然使用 const 修飾變量為只讀,但是 MDK 編譯器仍將這兩個數組放在了 RAM 區(全局變量)。這意味著,這個變量仍可寫(通過指針方式修改),只是不能直接修改而已,還白白浪費了
    發表于 10-19 10:05 ?443次閱讀
    <b class='flag-5'>const</b> <b class='flag-5'>聲明</b>的<b class='flag-5'>變量</b>不<b class='flag-5'>一定</b>是只讀的?
    百家乐棋牌正式版| 宝马会百家乐娱乐城| 威尼斯人娱乐城代理注册| 免费百家乐官网游戏下| 新国美娱乐城| 大发888官网df888| 百利宫百家乐现金网| 百家乐官网连长| 百家乐官网计划软件| 澳门玩百家乐官网赢1000万| 乐博娱乐| 大发888易付168| 赌场百家乐信誉| 大家旺百家乐官网的玩法技巧和规则| 宣城市| bet365百家乐| 威尼斯人娱乐棋牌下载| 缅甸百家乐网络赌博解谜| 百家乐官网怎样下注| E世博百家乐官网娱乐城| 黄浦区| 大西洋城娱乐| 棋牌游戏网站| 全讯网网址| 九州百家乐的玩法技巧和规则| 百家乐有看牌器吗| 朔州市| 襄樊市| 伊吾县| 奥斯卡娱乐城| 曼哈顿娱乐城| 伟德亚洲| 大发888客户端的 软件| 威尼斯人娱乐欢迎您| 百家乐娱乐分析软件v| 免费百家乐统计软件| 皇城百家乐娱乐城| 郑州太阳城宾馆| 大发888娱乐城 真钱下载| 德州扑克在线游戏| 大赢家即时比分网|