[cpp]
const int a = 1;
int *b = (int*)&a;
*b = 31; // 編譯通過,運行時 a 和 b 均變為 31
C 語言 const 是編譯期語法約束,而非運行期內存保護:
a = 2;),有則報錯 error C2166。const 變量在內存中與普通變量無任何區別(無只讀段保護),可通過指釖間接修改。memset、memcpy 等庫函數同樣可修改 const 內存。早期 C 標準無 const,C++ 引入後 C99 借鑒加入。C 編譯器對 const 處理極簡單:僅在語法分析階段做檢查,代碼生成階段完全忽略。
C++ 中 const 全局變量默認內部鏈接,編譯器可能將其放入只讀段(.rodata),間接修改可能導致段錯誤(視平台/優化而定)。C 則無此保證。
const 表達「不應修改」的語義,讓編譯器幫你攔截誤寫。const 對象(未定義行為)。mprotect、嵌入式 Flash 鎖定)。