遇到了乙個關於const修飾的變數值是否能修改問題,雖然我知道const變數在某些情況下可以通過指向它的指標來間接修改,但是對原理還是很模糊,今天就整理了一下。
#include int main(void編譯一下,看看出現什麼情況:)
很遺憾,編譯出錯了。
#include int main(void)編譯執行,看看出現什麼情況:~
編譯正常,執行正常
#include編譯執行看現象:const int i = 5;
int main(void)
編譯通過了,執行時出現了段錯誤。
這個我們可以通過分析實驗1和2來進行定論,實驗1是通過顯式修改的方式來修改變數值,結果編譯器報錯。那說明在編譯時期,編譯器就能發現const被修改這個錯誤;但是實驗2,我們通過指標來間接修改它的值,卻發現編譯器不僅沒報錯,反而變數值也被成功修改。說明const常量只是乙個編譯期間的常量。
為了搞清楚這個問題,我進行了實驗3,卻發現執行時出現了段錯誤。
我們都知道,出現段錯誤的原因無非就是這麼幾個:訪問乙個不存在的位址、訪問系統保護的位址、訪問唯讀記憶體位址、讀寫乙個空指標、堆疊溢位、陣列越界等。我們知道const全域性變數儲存在全域性儲存空間,而且是唯讀的,因此試圖修改會出現段錯誤。
修改const變數
宣告 不同於c語言的const變數修改問題 可以通過指標間接修改const變數的值 這裡只討論c 裡的const。c const 修飾符,表示常量,即如果以後保證不會修改則宣告為const,否則若要修改,那一開始為什麼還要宣告為const呢?根據c 標準,對於修改const變數,屬於 未定義行為 指...
強行修改const唯讀變數
修改const唯讀變數,只能修改區域性常量,不能修改全域性靜態常量。例如 某函式內部 const int const value 100 int ptr int const value ptr 200 因為在函式內部宣告的 const value,其本質上還是乙個函式內的區域性變數,儲存區在該函式的...
C 中修改const成員變數
在c 中,被const修飾的變數,表示其不可變。當然c 提供了型別轉換操作符const cast,用來將變數的const屬性臨時性地去掉。如果在乙個類裡面有乙個const成員變數,我們如何在成員函式中修改它呢?class test 那麼我們可以寫這麼乙個函式 void test seta int a...