9

我正在尝试从变量(char *)中删除 const-ness,但由于某种原因,当我尝试更改值时,const 变量的原始值仍然保持不变。

 const char* str1 = "david";
 char* str2 = const_cast<char *> (str1);
 str2 = "tna";

现在 str2 的值发生了变化,但 str1 的原始值保持不变,我在 Google 上查找过但找不到明确的答案。

使用 const_cast 并更改值时, const 变量的原始值是否也应更改?

4

2 回答 2

10

的类型str1const char*。它是charthat is const,而不是指针。也就是说,它是一个指向const char. 这意味着你不能这样做:

str1[0] = 't';

这将改变其中一个const chars 的值。

现在,您所做str2 = "tna";的是更改指针的值。没关系。您只是更改str2为指向不同的字符串文字。现在str1str2指向不同的字符串。

使用非const指针str2,您可以这样做str2[0] = 't';-但是,您将有未定义的行为。您不能修改最初声明的内容const。特别是,字符串文字存储在只读内存中,试图修改它们会给你带来可怕的不幸。

如果你想获取一个字符串文字并安全地修改它,用它初始化一个数组

char str1[] = "david";

这会将字符串文字中的字符复制到char数组中。然后,您可以根据自己的喜好修改它们。

于 2013-03-12T10:03:01.297 回答
3

str2只是一个指针。你的代码只是改变了指针的值,地址,而不是它指向的字符串。

更重要的是,您尝试做的事情会导致未定义的行为,并且很可能会导致运行时错误。所有现代编译器都会将您的字符串存储"david"在只读内存中。尝试修改该内存将导致内存保护错误。

于 2013-03-12T10:02:46.887 回答