天天看點

C語言:const修飾的常量,不能被直接修改 ,但是可以通過指針進行間接修改所出現的一些問題解釋

前言:

在學習黑馬教學const修飾指針的時候,碰到一個問題如下 在.cpp檔案下編譯時出現報錯,.c檔案下不報錯 。這種能騙過編譯器的寫法不提倡。在嚴格的編譯器上都是UB(undefined behavior )行為無法通過編譯。

1. .cpp檔案:

C語言:const修飾的常量,不能被直接修改 ,但是可以通過指針進行間接修改所出現的一些問題解釋

問題分析:類型不對 要改成

int*p=(int*)&a

,而且用指針去通路一個不對的東西,通路就是讀寫,是一個未定義行為。

改成

int*p=(int*)&a

但是結果卻是a=10,*p=100;我們是需要a=*p=100。

為了改善這種狀況,我們可以在定義a時再加一個volatile修飾,避免編譯器優化:

C語言:const修飾的常量,不能被直接修改 ,但是可以通過指針進行間接修改所出現的一些問題解釋

2. .c檔案:

C語言:const修飾的常量,不能被直接修改 ,但是可以通過指針進行間接修改所出現的一些問題解釋

**問題分析:**直接這樣寫在.c檔案下不報錯,是因為visual studio做了優化,這是在混過編譯器,不可取,是以以後const修飾,還是同意寫成以下格式

volatile const int a = 10;
	int* p = (int*)&a;
	*p = 100;
           

visual studio有自動優化效果是以在.c檔案下能實作這種功能,下面是我用特制開了嚴格模式的dev c++ 出現的情況:

C語言:const修飾的常量,不能被直接修改 ,但是可以通過指針進行間接修改所出現的一些問題解釋

可以看出其實這種寫法是不可取的,不能因為能蒙混過部分編譯器而去使用這種寫法!!!

繼續閱讀