衡阳派盒市场营销有限公司

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加盟合作| 网上百家乐官网分析软件| 湛江市| 2024年九运的房屋风水吉凶| 大发888娱乐城登录| 阳宅24山吉凶方位| 宁波市| 百家乐老千| 波音百家乐游戏| 永顺县| 百家乐的路单怎样看| 百家乐官网技巧和规律| 太阳城百家乐杀祖玛| 百家乐官网赢钱海立方| 大发888娱乐城优惠码lm0| 旧金山百家乐官网的玩法技巧和规则| 皇冠足球比分网| 百家乐荷官培训| 百苑百家乐官网的玩法技巧和规则 | 玩机器百家乐心得| 澳门百家乐官网走势图怎么看| 大发888我的爱好| 博彩百家乐网址| 模拟百家乐游戏软件| 百家乐官网翻天粤语qvod| 足球赛事直播| 莆田棋牌游戏| 视频百家乐平台| 百家乐官网德州扑克发牌盒| 仕达屋娱乐城| 江山百家乐的玩法技巧和规则| 百家乐官网任你博娱乐场| 利来国际娱乐| 百家乐7scs娱乐场| 百家乐澳门路规则算法| 华安县| 半圆百家乐官网桌子| 百家乐官网平注常赢打法| 百家乐官网国际赌场娱乐网规则|