對const關鍵字的理解

來源:互聯網
上載者:User

作者:王海寧,華清遠見嵌入式學院講師。

目前在進行C語言補習時,發現很多的同學對於const這個關鍵字的理解存在很大的誤解。現在總結下對這個關鍵字理解上的誤區,希望在以後的編程中,能夠靈活使用const這個關鍵字。

1、 const修飾的變數是常量還是變數

對於這個問題,很多同學認為const修飾的變數是不能改變,結果就誤認為該變數變成了常量。那麼對於const修飾的變數該如何理解那?

下面我們來看一個例子:

int main
        {
                char buf[4];
                const int a = 0;

        a = 10;
        }

這個比較容易理解,編譯器直接報錯,原因在於“a = 10;”這句話,對const修飾的變數,後面進行賦值操作。這好像說明了const修飾的變數是不能被修改的,那究竟是不是那,那麼下面我們把這個例子修改下:

int main
        {
                char buf[4];
                const int a = 0;

        buf[4] = 97;
                printf(“the a is %d/n”,a);
        }

其中最後一句printf的目的是看下變數a的值是否改變,根據const的理解,如果const修飾的是變數是不能被修改的話,那麼a的值一定不會改變,肯定還是0。但是在實際啟動並執行結果中,我們發現a的值已經變為97了。這說明const修飾的變數a,已經被我們程式修改了。

那綜合這兩個例子,我們來分析下,對於第二例子,修改的原因是buf[4]的賦值操作,我們知道buf[4]這個變數已經造成了buf這個陣列變數的越界訪問。buf數組的成員本身只有0,1,2,3,那麼buf[4]訪問的是誰那,根據局部變數的地址分配,可以知道buf[4]的地址和int a的地址是一樣,那麼buf[4]實際上就是訪問了const int a;那麼對buf[4]的修改,自然也修改了const int a的空間,這也是為什麼我們在最後列印a的值的時候看到了97這個結果。

那麼我們現在可以知道了,const修飾的變數是不具備不允許修改的特性的,那麼對於第一個例子的現象我們又如何解釋那。

第一個例子,錯誤是在程式編譯的時候給出的,注意這裡,這個時候並沒有產生可執行檔,說明const修飾的變數可否修改是由編譯器來幫我們保護了。而第二個例子裡,變數的修改是在可執行程式執行的時候修改的,說明a還是一個變數。

綜上所述,我們可以得出一個結論,那就是const修飾的變數,其實質是告訴程式員或編譯器該變數為唯讀,如果程式員在程式中顯示的修改一個唯讀變數,編譯器會毫不留情的給出一個error。而對於由於像數組溢出,隱式修改等程式不規範書寫造成的運行過程中的修改,編譯器是無能為力的,也說明const修飾的變數仍然是具備變數屬性的。

2、 被const修飾的變數,會被作業系統保護,防止修改

如果對於第一個問題,有了理解的話,那麼這個問題,就非常容易知道答案了。Const修飾的變數是不會被作業系統保護的。

其原因是作業系統只保護常量,而不會保護變數的讀寫。那麼什麼是常量?比如“hello world”這個字串就是被稱為字串常量。

對於這個問題的另一種證明方法,可以看下面這個程式:

int main
        {
                const int a;
                char *buf = “hello world”;

        printf(“the &a is %p, the buf is %p/n”,&a, buf);
        }

可以發現buf儲存的地址是在0x08048000這個地址附近的,而a的地址是在0xbf000000這個地址附近的,而0x08048000附近的地址在我們linux作業系統上是程式碼片段。這也說明了常量和變數是存放在不同地區的,自然作業系統是會保護常量的。

如果我們知道這個道理後,再看下面的題目:

int main
        {
                char *buf = “hello”;

        buf[0] = ‘a’;
                printf(“the buf is %s/n”,buf);
        }

我們可以思考下,這個程式的運行結果會是什麼呢?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.