強制修改const char*類型的數據

C++是一門類型安全(type-safe)的編程語言,它對類型的檢查是十分嚴格的。一個const char*類型的數據是不允許被修改的,如果程序違反了這條規定,編譯器將毫不留情地提示錯誤,不讓通過。作爲程序員,須知道這樣的限制是很有實際意義的,畢竟大多數情況下我們需要類型安全的代碼。但是有的時候,我們真的需要修改const char*類型的數據,怎麼辦?沒問題,C++同樣也是一門相當靈活的編程語言,它提供了const_cast<>專門處理這種需求。

舉個例子。看下面的代碼:

char szArray[]="Constring";
const char* str1=szArray;
str1[0]='c';  //#1 Error
char* str=const_cast<char*>(str1);
str[0]='c';   //#2 OK

#1處將會出錯,編譯不能通過;而一旦使用const_cast<>去除str1所指內存的常量性後,再去修改它的內容就被允許了。可見強制修改const char*類型數據的方法是:使用const_cast<>去除字符串的常量性,讓它可以被修改。

不過,有一種特別的情況不可忽視,看下面的代碼:

const char* str1="Constring";
char* str=const_cast<char*>(str1);
str[0]='c';    //#3 Runtime Error

編譯器沒有報錯,因爲上面的代碼沒有語法問題;可是,程序一旦跑起來卻會在#3處拋出了access violation異常,出現運行時錯誤。原因很簡單,"Constring"存放於常量數據區,是不可修改的。這種強制性是不容商量的,它不是語法上的約束,而是內存安全方面語義上的約束。

總結一下,一共有3點:

(1)const char*類型的數據從語法上看是不可被修改的,程序員在大多數情況真的應該“循規蹈矩”;

(2)只有在的確需要修改的時候,才使用const_cast<>轉型操作抹去const數據的常量性,進而對數據進行修改,動作雖然“粗魯”但可行;

(3)常量數據區的數據的const屬性是不容商量的,就算你用const_cast<>騙過了編譯器,程序跑起來後也一定會出現異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章