const變數的儲存方式

2021-06-21 11:27:37 字數 1080 閱讀 1700

在帖子的最後,有這麼乙個很有趣的實驗:

[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專家程式設計 21頁***************==

關鍵字const並不能把變數變成常量!在乙個符號前加上const限定符只是表示 這個變數,對於這個符號來說是唯讀的

const修飾的變數的儲存位置

c語言中const全域性變數儲存在唯讀資料段,編譯期最初將其儲存在符號表中,第一次使用時為其分配記憶體,在程式結束時釋放。而const區域性變數 區域性變數就是在函式中定義的乙個const變數,儲存在棧中,塊結束時釋放。在c語言中可以通過指針對const區域性變數進行修改,而不可以對const全域性...

C變數的儲存方式

變數可以分為全域性變數 靜態全域性變數 靜態區域性變數和區域性變數 按儲存區域分 全域性變數 靜態全域性變數和靜態區域性變數都存放在記憶體的全域性資料區,區域性變數存放在記憶體的棧區 按作用域分 全域性變數在整個工程檔案內都有效 靜態全域性變數只在定義它的檔案內有效 靜態區域性變數只在定義它的函式內...

c c 變數的儲存方式

前面已經介紹了,從變數的作用域 即從空間 角度來分,可以分為全域性變數和區域性變數。從另乙個角度,從變數值存在的作時間 即生存期 角度來分,可以分為 靜態儲存方式和動 態儲存方式。使用者儲存空間可以分為三個部分 程式區 靜態儲存區 動態儲存區。全域性變數全部存放在靜態儲存區,在程式開始執行時給全域性...