首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言 const 實現機制深度解析:編譯期檢查而非運行期保護

     編輯:關於C語言

經典面試題

[cpp]
const int a = 1;
int *b = (int*)&a;
*b = 31; // 編譯通過,運行時 a 和 b 均變為 31

核心結論

C 語言 const 是編譯期語法約束,而非運行期內存保護:

  • 編譯器檢查源碼中是否有直接修改 const 變量的語句(如 a = 2;),有則報錯 error C2166。
  • 編譯通過後,const 變量在內存中與普通變量無任何區別(無只讀段保護),可通過指釖間接修改。
  • memset、memcpy 等庫函數同樣可修改 const 內存。

歷史背景

早期 C 標準無 const,C++ 引入後 C99 借鑒加入。C 編譯器對 const 處理極簡單:僅在語法分析階段做檢查,代碼生成階段完全忽略。

對比 C++

C++ 中 const 全局變量默認內部鏈接,編譯器可能將其放入只讀段(.rodata),間接修改可能導致段錯誤(視平台/優化而定)。C 則無此保證。

最佳實踐

  • 用 const 表達「不應修改」的語義,讓編譯器幫你攔截誤寫。
  • 嚴禁通過指針修改 const 對象(未定義行為)。
  • 需真正只讀內存時,依賴平台特定機制(如 mprotect、嵌入式 Flash 鎖定)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved