const變數的儲存區及修改許可權

2022-08-26 01:03:12 字數 986 閱讀 3308

**const變數的儲存區及修改許可權

[cpp]view

plain

copy

const

inta = 1;  

int*p = 

const_cast

<

int*>(&a);  

*p = 2;  

cout << 「value a=」<< a << endl;  

cout << 「value *p=」 <<*p << endl;  

cout << 「address a=」 <<&a << endl;  

cout << 「address p=」 <

const變數居然被合法的修改了!

這裡說說我最近的想法:

const變數有全域性的和區域性的,c語言中全域性的const變數預設為外連線,所以預設都是有記憶體位址的,c++中全域性的const變數預設為內連線,它可以被編譯 器放到符號表中作為編譯期常量,所以在c中,const int k = 2; int a[k]是非法的,但在c++中是合法的。這是全域性const變數,區域性的const變數在c和c++中一視同仁,都是放在函式區域性棧中的,把編譯後的可執行檔案在彙編級除錯一下馬上就能看出來。

這樣,問題就很明了。在c和c++中,區域性的const變數只是用來嚇唬人的,想改它的值照樣改,因為它存在於函式區域性棧中,根本就不受任何許可權的保護。當然修改的時候只要做個強制型別轉化就好。至於全域性的const變數,c中預設是外連線,它有位址,有位址當然也能夠被改掉,所以,你可以像在c語言中改變區域性const變數那樣通過指標來修改全 局const的值,編譯時沒有任何問題,連個warning都沒有,只不過在執行時,你會得到乙個segmentation fault而已。為什麼呢?因為全域性的const變數是存放在唯讀資料段裡的,它比函式區域性棧裡的那些const變數高階,它受到唯讀資料段的許可權保護,

所以,你試圖修改乙個唯讀資料段中的內容,會得到乙個執行時錯誤。

變數的儲存區

一.在c中分為這幾個儲存區 1.棧 有編譯器自動分配釋放 2.堆 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 3.全域性區 靜態區 全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的 另一塊區域。程...

const變數的儲存方式

在帖子的最後,有這麼乙個很有趣的實驗 cpp view plain copy const inta 1 int p const cast int a p 2 cout value a a endl cout value p p endl cout address a a endl cout addr...

C 中const變數的修改

今天偶然在群裡看到這樣乙個問題 include int main 求輸出結果,只要掌握const變數的一些知識應該會得出答案a 10,p 20,但是這個題還有價值可究,如為什麼在偵錯程式中執行完後 a 20,p 20呢?如圖,為此群裡有個大神找到了這樣一篇文章 簡單介紹一下const變數,const...