我試圖從變量(char *)中刪除常量,但由於某種原因,當我嘗試更改該值時,常量變量的原始值仍保持不變。從變量中刪除常量
const char* str1 = "david";
char* str2 = const_cast<char *> (str1);
str2 = "tna";
現在的str2的變化,但str1中原始值的值保持不變,我看它在谷歌,但找不到一個明確的答案。
當使用const_cast並更改值時,const變量的原始值是否也會改變?
我試圖從變量(char *)中刪除常量,但由於某種原因,當我嘗試更改該值時,常量變量的原始值仍保持不變。從變量中刪除常量
const char* str1 = "david";
char* str2 = const_cast<char *> (str1);
str2 = "tna";
現在的str2的變化,但str1中原始值的值保持不變,我看它在谷歌,但找不到一個明確的答案。
當使用const_cast並更改值時,const變量的原始值是否也會改變?
str1
的類型是const char*
。它是char
即const
,而不是指針。也就是說,這是一個指向const char
的指針。這意味着你可以這樣做:
str1[0] = 't';
這將改變const
char
S的一個值。
現在,你在做什麼,當你做str2 = "tna";
正在改變指針的值。沒關係。您只是將str2
更改爲指向不同的字符串文字。現在str1
和str2
指向不同的字符串。
有了您的非const
指針str2
,你可以做str2[0] = 't';
- 然而,你必須未定義的行爲。您無法修改最初宣稱爲const
的內容。特別是字符串文字存儲在只讀存儲器中,試圖修改它們會給你帶來可怕的不幸。
如果你想利用一個字符串字面量,安全地修改它,初始化一個陣列它:
char str1[] = "david";
這將字符從字符串字面量轉移到char
陣列複製。然後你可以根據自己的喜好修改它們。
str2
只是一個指針。而你的代碼只是改變指針的值,地址,而不是它指向的字符串。
更重要的是,您試圖執行的操作會導致未定義的行爲,並且很可能會導致運行時錯誤。所有現代編譯器都會將字符串"david"
存儲在只讀存儲器中。嘗試修改該內存將導致內存保護錯誤。
好的,那麼有沒有辦法可以通過強制轉換來改變const char *變量的值? – 2013-03-12 10:07:17
@DavidFaiz你可以在沒有強制轉換的情況下修改指針。如果您已將指針設置爲指向字符串文字,您*無法*修改'char'。字符串文字是不變的。查看我的最新編輯,瞭解如何將字符串文字複製到數組。 – 2013-03-12 10:08:31
只是看到它,並得到它! 非常感謝您的快速回復! 所以基本上我不能修改文字字符串,只是使用const char變量並指向一個不同的字符串。 – 2013-03-12 10:10:06