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

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

    文章

    1635

    瀏覽量

    148028
  • RAM
    RAM
    +關注

    關注

    8

    文章

    1368

    瀏覽量

    114698
  • CONST
    +關注

    關注

    0

    文章

    44

    瀏覽量

    8168

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

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

收藏 人收藏

    評論

    相關推薦

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

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

    請問如何防止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 ?560次閱讀
    你會使用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 ?4850次閱讀

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

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

    const 和指針變量使用

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

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

    雖然使用 const 修飾變量為只讀,但是 MDK 編譯器仍將這兩個數組放在了 RAM 區(全局變量)。這意味著,這個變量仍可寫(通過指針方式修改),只是不能直接修改而已,還白白浪費了
    發表于 10-19 10:05 ?405次閱讀
    <b class='flag-5'>const</b> <b class='flag-5'>聲明</b>的<b class='flag-5'>變量</b>不<b class='flag-5'>一定</b>是只讀的?
    主站蜘蛛池模板: 国产三级中文字幕| 天天亚洲综合| 激情视频综合网| 免费在线一区二区三区| 日韩在线免费看网站| 亚洲日本欧美| 色天使网| 91热成人精品国产免费| 四虎tv在线观看884aa| 午夜欧美电影| 艹逼免费视频| 欧美性猛交xxxx| 色cccwww| 天天干中文字幕| 日韩欧美印度一级毛片| 亚洲精品久久久久影| 狠狠要| 久久国内| 五月天停婷基地| 欧美性色欧美a在线观看| 午夜福利毛片| 男女艹逼软件| 狠狠色狠狠色综合网| 97人摸人人澡人人人超一碰| 四月婷婷七月婷婷综合| 夜夜视频| 狠狠干2021| 国产精品国产主播在线观看| 宅男666在线永久免费观看| 色欧美色图| 天堂在线最新版在线www| 69精品在线| jiuse在线| 男人一级片| 国产三级在线观看播放| 欧美ol丝袜高跟秘书在线观看| 色激情综合| 久久久久久国产精品免费免费| 迅雷www天堂在线资源| 亚洲国产午夜看片| 99久久99久久久精品齐齐鬼色 |