強行修改const唯讀變數

2021-09-19 17:29:54 字數 508 閱讀 3936

修改const唯讀變數,只能修改區域性常量,不能修改全域性靜態常量。

例如:

// 某函式內部

const

int const_value =

100;

int* ptr =

(int*)

&const_value;

*ptr =

200;

因為在函式內部宣告的 const_value,其本質上還是乙個函式內的區域性變數,儲存區在該函式的棧幀內,而程式對該記憶體區擁有修改的許可權。

相應地,用同樣方法試圖修改全域性或靜態常量資料的值,如下所示:

char

* pc =

(char

*)const_data;

*pc =

'x';

編譯器並不會報告任何錯誤,編譯可以通過。但當程式執行到第二行**時,就會因為 segment violation 而崩潰,原因在於程式對該位置的記憶體區沒有修改許可權。

const 修飾的唯讀變數

const 修飾的唯讀變數必須在定義的同時初始化 編譯器通常不為普通const 唯讀變數分配儲存空間,而是將它們儲存在符號表中,這使 得它成為乙個編譯期間的值,沒有了儲存與讀記憶體的操作,使得它的效率也很高。例如 define m 3 巨集常量 const int n 5 此時並未將n 放入記憶體中...

iOS 修改唯讀變數

在ios中唯讀變數是不應該被修改的,特別是框架類的唯讀變數,修改了可能帶來莫名其妙的錯誤 但是不應該不等於不能,通過動態執行時還是可以修改的 比如 inte ce reonlyobject nsobject property nonatomic,readonly nsnumber number en...

修改const變數

宣告 不同於c語言的const變數修改問題 可以通過指標間接修改const變數的值 這裡只討論c 裡的const。c const 修飾符,表示常量,即如果以後保證不會修改則宣告為const,否則若要修改,那一開始為什麼還要宣告為const呢?根據c 標準,對於修改const變數,屬於 未定義行為 指...