从变量中删除const-ness

时间:2013-03-12 10:00:11

标签: c++ casting const const-cast

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

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

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

当使用const_cast并更改值时,const变量的原始值是否也会发生变化?

2 个答案:

答案 0 :(得分:10)

str1的类型为const char*charconst,而不是指针。也就是说,它是指向const char的指针。这意味着你不能这样做:

str1[0] = 't';

这会改变其中一个const char的价值。

现在,当你执行str2 = "tna";时你正在做的是改变指针的值。没关系。您只是将str2更改为指向不同的字符串文字。现在str1str2指向不同的字符串。

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

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

char str1[] = "david";

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

答案 1 :(得分:3)

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

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