前言:
在學習黑馬教學const修飾指針的時候,碰到一個問題如下 在.cpp檔案下編譯時出現報錯,.c檔案下不報錯 。這種能騙過編譯器的寫法不提倡。在嚴格的編譯器上都是UB(undefined behavior )行為無法通過編譯。
1. .cpp檔案:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNCM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPRF2MWhkWohmMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLwQTO5EjMyYTM0IzMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
問題分析:類型不對 要改成
int*p=(int*)&a
,而且用指針去通路一個不對的東西,通路就是讀寫,是一個未定義行為。
改成
int*p=(int*)&a
但是結果卻是a=10,*p=100;我們是需要a=*p=100。
為了改善這種狀況,我們可以在定義a時再加一個volatile修飾,避免編譯器優化:
2. .c檔案:
**問題分析:**直接這樣寫在.c檔案下不報錯,是因為visual studio做了優化,這是在混過編譯器,不可取,是以以後const修飾,還是同意寫成以下格式
volatile const int a = 10;
int* p = (int*)&a;
*p = 100;
visual studio有自動優化效果是以在.c檔案下能實作這種功能,下面是我用特制開了嚴格模式的dev c++ 出現的情況:
可以看出其實這種寫法是不可取的,不能因為能蒙混過部分編譯器而去使用這種寫法!!!